无法理解C中两行的含义

无法理解C中两行的含义,c,C,程序逐行将文本文件读入字符串数组。我无法理解代码中两行的含义: char **words = (char **)malloc(sizeof(char*)*lines_allocated); ... words = (char **)realloc(words,sizeof(char*)*new_size); ... 请你帮我理解一下好吗 char **words = (char **)malloc(sizeof(char*)*lines_allocated); 分配行\u分配的指针。使用

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

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

...

words = (char **)realloc(words,sizeof(char*)*new_size);
...
请你帮我理解一下好吗

char **words = (char **)malloc(sizeof(char*)*lines_allocated);
分配
行\u分配的
指针。使用指向指针的指针时,需要为指针分配空间,并为每个指针分配数据空间,在本例中为
char*

words = (char **)realloc(words,sizeof(char*)*new_size);
这会更改缓冲区的大小,因为在读取文件之前,行数未知,因此需要增加分配的指针数

单词
指向一个块,该块将首先存储
行分配的
指针,然后在需要时将其增加到
新大小

在您的代码中也有这样一行:

/* Allocate space for the next line */
words[i] = malloc(max_line_len);
它将分别分配每个字符串


另外,不要强制转换malloc的结果:


第一行分配一个指向字符指针的指针。在C中,指向某个对象的指针相当于指向同一个对象的数组的指针,因此这相当于说它将指向指向char的指针数组的指针分配给char

sizeof(char*)
是指针的大小,将其乘以
lines\u allocated
表示分配数组中指针的数量将
lines\u allocated


第二行重新分配指针数组,以便它现在可以包含
new\u size
指针,而不是
lines\u分配的
指针。如果
new\u size
较大,则新指针将未定义,必须在使用前初始化。

第一行分配一块动态内存(为指向
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
;如果您更改
单词的基本类型(例如,从
char
更改为
wchar\t
),则无需更改
malloc
realloc
调用


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

> for <代码> Malc C <代码> >代码> ReLoC/。如果您将代码编译为C++,则必须将其结果为MalOC/,但如果您编写C++,则不应首先使用<代码> MalOC