Q我正在用这段代码将文件的行读入数组。
char linebuf[80]; char *lines[100]; int i; for(i = 0; i < 100; i++) { char *p = fgets(linebuf, 80, fp); if(p == NULL) break; lines[i] = p; }为什么所有行最终都包含最后一行副本?
A您只为一行分配了内存,linebuf。每次调用fgets时,上一行都会被覆盖。fgets不进行任何内存分配:除非它到达文件末尾(或遇到错误),否则它返回的指针与您作为第一个参数(在本例中,是指向您唯一的linebuf数组)的指针相同。
要使此类代码生效,您需要为每行分配内存。请参阅问题 20.2 以获取示例。
参考文献:K&R1 第 7.8 节,第 155 页
K&R2 第 7.7 节,第 164-5 页
ISO 第 7.9.7.2 节
H&S 第 15.7 节,第 356 页