我正在尝试使用文件中的名称填充数组:
Andrew
Andy
Bob
Dan
Derek
Joe
Pete
Richy
Steve
Tyler
这是我写的函数......但是当我运行它时程序崩溃了:
#include <stdio.h>
main(){
int i=0, size=10;
char fname[15];
char** data;
char* name;
FILE* fp;
printf("Enter a filename to read names:\n");
scanf("%s", fname);
fp = fopen(fname, "r");
if(fp == NULL)
exit();
data = (char**)malloc(sizeof(char**)*size);
while(!feof(fp)){
fscanf(fp, "%s", name);
data[i] = (char*)malloc(sizeof(name));
data[i] = name;
i++;
}
fclose(fp);
printf("\n\n");
for(i=0; i<size; i++)
printf("%s ", data[i]);
free(data);
}
任何人都知道我做错了什么? 感谢
答案 0 :(得分:5)
您永远不会为名称分配空间。但你把东西放在这一行:
fscanf(fp, "%s", name);
变化
char name[100];
和
fscanf(fp, "%99s", name);
你也应该将输入限制为文件名:
scanf("%14s", fname);
你也永远不会为数组中的每个元素释放数据,如果这是一个较大系统中的子程序,它就会有内存泄漏。
答案 1 :(得分:5)
这里有几个错误:
1)你永远不会分配存储name
的内存。你可以通过使用:
char name[128];
然后,当您使用fscanf时,您将拥有:
fscanf(fp, "%127s", name); // stores this in name correctly, now...
2)你不恰当地为data[i]
分配空间:
data[i] = (char*)malloc(sizeof(name));
这将分配空间来保存一个指向char (char*
)的指针,因为name是char*
。你需要这样做:
data[i] = (char*)malloc(sizeof(char) * (strlen(name) + 1 ) );
这将为数据和单个终止字符分配足够的空间。
3)您没有正确分配data[i]
。您不能在此处使用=
,而是需要使用strcpy:
strcpy(data[i], name);
4)你没有释放data[..]
元素中的单个指针。你应该在printf之后添加一个免费的:
for(i=0; i<size; i++)
{
printf("%s ", data[i]);
free(data[i]); // Free each pointer you allocate
}
每个malloc
来电最终应该有一个匹配的free
来电。
答案 2 :(得分:0)
有很多问题。其他答案谈论名称没有被初始化,所以我不会重复。
第二个问题是您没有正确处理EOF。只有在您尝试阅读文件末尾时,feof才会返回true。所以你会得到一个空的第11个名字。
最后一个问题是数据数组只能容纳10个名字。由于第二个问题,你将使用空白的第11个名称溢出缓冲区。此外,您的代码取决于输入文件的详细信息 - 为其提供具有更多名称的不同输入文件,即使在修复问题2后您仍然会崩溃。