无法理解C中两行的含义

时间:2015-09-29 12:35:38

标签: c

This程序逐行将文本文件读入字符串数组。我无法理解代码中两行的含义:

char **words = (char **)malloc(sizeof(char*)*lines_allocated);

...

words = (char **)realloc(words,sizeof(char*)*new_size);
...

请你能帮我理解吗?

3 个答案:

答案 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),则无需更改mallocrealloc调用。

realloc如果无法扩展缓冲区将返回NULL,因此首先将结果分配给临时变量更安全,否则您可能会失去对该内存的引用,这意味着您赢了无法访问或释放它。