【问题标题】:Memory allocation for strings of array数组字符串的内存分配
【发布时间】:2022-01-17 14:37:42
【问题描述】:

我需要解析 csv 文件。我创建字符串数组并为此分配内存 第一个循环while(fgets(line,100,fp)是成功的,但是当它进入第二个时值被line的数据覆盖

while (fgets(line, 100, fp))
{
    num_of_string++;
    code = (char **)realloc(code, sizeof(char *) * (num_of_string));
    occupation = (char **)realloc(occupation, sizeof(char *) * (num_of_string));
    num_of_ppl = (char **)realloc(num_of_ppl, sizeof(char *) * (num_of_string));
    
    char * column = strtok(line, ",");
    code[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
    code[num_of_string-1] = column;
    counter++;
    while (column)
    {
        if (counter == 1)
        {
            column = strtok(NULL, "\"");
            occupation[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
            occupation[num_of_string-1] = column;
            counter++;
            column = strtok(NULL, ",");
        } else if (counter == 2) {
            num_of_ppl[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
            num_of_ppl[num_of_string-1] = column;
            counter++;
            column = strtok(NULL, ",");
        } else {
            column = strtok(NULL, ",");
            counter++;
        }
    }
    counter = 0;
}

【问题讨论】:

    标签: c memory allocation


    【解决方案1】:

    错误在这里:

    code[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
    code[num_of_string-1] = column;
    

    第二个分配用指向column 指向的数据的指针覆盖专用分配的块。每当解析新行时,这些数据就会被覆盖。

    我建议使用strdup() 来分配缓冲区并复制字符串。

    只需将上面的两行替换为:

    code[num_of_string-1] = strdup(column);
    

    数组occupationnum_of_pll 也有类似的错误。

    【讨论】:

    • 注意:strdup() 还不是标准 C 库的一部分,但可能会与 C2X(2023 年?)一起使用。
    【解决方案2】:
                column = strtok(NULL, "\"");
                occupation[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
                occupation[num_of_string-1] = column;
    

    指针column 指向您的缓冲区line,这对于您从文件中读取的所有行都是通用的。 您为令牌分配内存,但随后分配 column 造成内存泄漏,因为您无法再释放分配的内存。 通过为所有数组条目分配指向同一缓冲区的指针,您将破坏旧条目。

    这不是复制字符串的工作方式。 您需要改用strcpy

                column = strtok(NULL, "\"");
                occupation[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
                strcpy(occupation[num_of_string-1], column);
    

    您还应该检查NULL 指针的每个返回值。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2011-03-22
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多