繁体   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