数组字符串的内存分配
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);
数组occupation
和num_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
指针的每个返回值。
【讨论】:
以上是关于数组字符串的内存分配的主要内容,如果未能解决你的问题,请参考以下文章