【问题标题】:how to dynamically allocate memory for a struct type array in C如何在C中为结构类型数组动态分配内存
【发布时间】:2022-01-27 01:49:38
【问题描述】:

所以我有一个程序,我需要读取一个文件并将其中的一些单词存储在一个数组中,但我想这样做,以便在我存储各个单词的每个数组中根据如何自定义大小我有很多话

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);
    }
}

【问题讨论】:

  • fscanf(keywords,"%s", keyword[i].keyword); 调用未定义的行为。 keyword[i].keyword 是一个不确定的指针,它后面没有为您的存储保留的内存。
  • 为什么keyword 是指针而不是数组?
  • @Barmar 来自在线示例,这就是我看到其他人为结构类型数组分配内存的方式
  • @WhozCraig 那么我如何分配内存用于存储?
  • 如果大小可以变化,则使用指针。但是如果你使用scanf(),你需要先为字符串分配一个缓冲区,所以它永远不会大于你分配的缓冲区。您不妨声明一个具有该长度的字符串。

标签: c memory struct


【解决方案1】:

您的代码无效,因为您没有为keyword 分配内存并且您将字符串扫描到其中。它调用未定义的行为 UB。

尽量不要使用全局变量。使用函数返回值和指针参数(如果需要)。

#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;
}

【讨论】:

  • 所以对于这一行for(int i = 0; i &lt; keywordNumber; i++) 我收到了这个警告:comparison between pointer and integer;
【解决方案2】:

我没有足够的代表发表评论,但是您收到其他答案代码的警告是因为 keywordNumberint *i 只是 int,所以您需要在for循环中首先取消引用keywordNumber(所以for (int i = 0; i &lt; *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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多