prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 7.4

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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管