数组字符串的内存分配

Posted

技术标签:

【中文标题】数组字符串的内存分配【英文标题】: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;

【问题讨论】:

【参考方案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 指针的每个返回值。

【讨论】:

以上是关于数组字符串的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

指针数组的动态内存分配

在字符串和结构数组中查找动态内存分配错误

C语言动态分配二维字符串数组

如何正确地为字符串“数组”动态分配内存

4-数组指针与字符串1.4-动态内存分配

c语言数组在内存中是怎么分配的?