This程序逐行将文本文件读入字符串数组。我无法理解代码中两行的含义:
char **words = (char **)malloc(sizeof(char*)*lines_allocated);
...
words = (char **)realloc(words,sizeof(char*)*new_size);
...
请你能帮我理解吗?
答案 0 :(得分:7)
char **words = (char **)malloc(sizeof(char*)*lines_allocated);
分配lines_allocated
个指针。使用指针指针时,需要为指针分配空间,并为每个指针分配空间,为数据分配空间,在本例中为char *
。
words = (char **)realloc(words,sizeof(char*)*new_size);
这会改变缓冲区的大小,因为在读取文件之前未知行数,然后需要增加分配的指针数。
words
指向将在第一时间存储lines_allocated
指针的块,然后在需要时将其增加到new_size
。
在你的代码中你也有这样的一行:
/* Allocate space for the next line */
words[i] = malloc(max_line_len);
将分别分配每个字符串。
另外,不要施放malloc的结果:
答案 1 :(得分:4)
第一行分配指向字符指针的指针。在C中指向某个东西的指针等同于指向同一个东西的数组的指针,所以这相当于它指向指向char的指针数组的指针。
sizeof(char*)
是指针的大小,并将其乘以lines_allocated
意味着分配的数组中的指针数将为lines_allocated
。
第二行重新分配指针数组,以便它现在可以包含new_size
指针而不是lines_allocated
指针。如果new_size
较大,则新指针将是未定义的,必须在使用之前进行初始化。
答案 2 :(得分:4)
第一行分配一块动态内存(为指向char
的指针数组创建空间);第二行调整了该块的大小。
写两行的更好方法是
char **words = malloc( sizeof *words * lines_allocated); // no cast, operand of sizeof
char **tmp = realloc( words, sizeof *words * new_size );
if ( tmp )
words = tmp;
在C中,你不需要转换任何一个调用的结果,这被认为是不好的做法。另外,请注意sizeof
的操作数;如果您更改words
的基本类型(例如,从char
更改为wchar_t
),则无需更改malloc
或realloc
调用。
realloc
如果无法扩展缓冲区将返回NULL
,因此首先将结果分配给临时变量更安全,否则您可能会失去对该内存的引用,这意味着您赢了无法访问或释放它。