簡體   English   中英

如何為 C 中的結構類型數組動態分配 memory

[英]how to dynamically allocate memory for a struct type array in C

所以我有一個程序,我需要讀取一個文件並將其中的一些單詞存儲在一個數組中,但我想這樣做,以便在我存儲各個單詞的每個數組中,根據我有多少單詞來自定義大小有

typedef struct {
    char* keyword;
    int keywordCount;
    int stdev;
} keywordData;

int keywordNumber;

keywordData* keyword;

void fetchKeywords(const char* filename)
{
    FILE* keywords = fopen(filename, "r");
    // first number in the file is the number of keywords in the file, so i dont need to count them
    fscanf(keywords,"%d", &keywordNumber);

    keyword = (keywordData *) malloc(keywordNumber * sizeof(keywordData));

    for(int i = 0; i < keywordNumber; i++)
    {
        fscanf(keywords,"%s", keyword[i].keyword);
        //printf("%s\n", keyword[i].keyword);
    }
}

您的代碼無效,因為您沒有為keyword分配 memory 並且您將字符串掃描到其中。 它調用未定義的行為 UB。

盡量不要使用全局變量。 使用 function 返回值和指針參數(如果需要)。

#define MAXKEYWORDLENGTH 64

typedef struct {
    char keyword[MAXKEYWORDLENGTH];
    int keywordCount;
    int stdev;
} keywordData;


keywordData *fetchKeywords(const char* filename, int *keywordNumber)
{
    FILE* keywords = fopen(filename, "r");
    keywordData *kd;
    // first number in the file is the number of keywords in the file, so i dont need to count them
    if(keywords) 
       if(fscanf(keywords,"%d", keywordNumber) != 1) { /* error handling*/}

    kd = malloc(*keywordNumber * sizeof(*kd));

    if(kd)
        for(int i = 0; i < keywordNumber; i++)
        {
            fscanf(keywords,"%s", kd[i].keyword);
            //printf("%s\n", keyword[i].keyword);
        }
    if(keywords) fclose(keywords);
    return kd;
}

我沒有足夠的代表發表評論,但是您收到其他答案代碼的警告是因為keywordNumber是一個int *i只是一個int ,所以您需要在 for 循環中首先取消引用keywordNumber (所以for (int i = 0; i < *keywordNumber; i++) ); 這段代碼應該修復它:

#define MAXKEYWORDLENGTH 64

typedef struct {
    char keyword[MAXKEYWORDLENGTH];
    int keywordCount;
    int stdev;
} keywordData;


keywordData *fetchKeywords(const char* filename, int *keywordNumber)
{
    FILE* keywords = fopen(filename, "r");
    keywordData *kd;
    // first number in the file is the number of keywords in the file, so i dont need to count them
    if(keywords) 
       if(fscanf(keywords,"%d", keywordNumber) != 1) { /* error handling*/}

    kd = malloc(*keywordNumber * sizeof(*kd));

    if(kd)
        for(int i = 0; i < *keywordNumber; i++)
        {
            fscanf(keywords,"%s", kd[i].keyword);
            //printf("%s\n", keyword[i].keyword);
        }
    if(keywords) fclose(keywords);
    return kd;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM