为什么固定数组可以工作,但当我尝试使用malloc使其动态时,它会出现分段错误?除了*10,我还试过各种各样的值。这只是使用一个小文件。我需要这个来处理一本9万字的字典。
FILE *fp;
long lSize;
//char buffer[100];
char *buffer=malloc(sizeof(char)*10);
int i = 0;
fp = fopen ( "cats.txt" , "rb" );
if( !fp ) perror("cats.txt"),exit(1);
wordTree = makeEmptyTree();
while( fscanf(fp, "%s", &buffer) != EOF )
{
addStringToTree(wordTree, buffer);
//printf("%sn", words[i]);
}
fclose(fp);
//free(buffer);
如果需要,我也可以包含addStringToTree。
编辑1
谢谢修复它的人。不幸的是,我无法让90000字的文本文件工作,仍然得到seg错误。
应该是
fscanf(fp, "%s", buffer) //remove the ampersand
更改
char *buffer=malloc(sizeof(char)*10);
至
char *buffer=malloc(100);
和
while( fscanf(fp, "%s", &buffer) != EOF )
至
while( fscanf(fp, "%s", buffer) != EOF )
然后再试一次。
sizeof(char)
总是返回1,buffer
的大小应该是100(因为在静态情况下是100)buffer
之前已经是指向char
、&
的指针,这是不必要的,并且将给出指针的地址,而不是buffer
指向的地址。(这可能是段故障的原因。)
您正在fscanf中传递指针对指针。只是在fscanf中有缓冲区。在"char buffer[]"的情况下,&缓冲区和缓冲区是等效的。因此,在这种情况下没有seg故障。
请注意,固定数组和动态分配数组的类型不同:
char buffer[100];
与。
char* buffer
Malloc返回动态分配内存的地址位置,因此不需要在其前面加上"&"。所以简单地使用这个:
while( fscanf(fp, "%s", buffer) != EOF )
{
.....