带有malloc的动态数组不起作用,但固定大小可以 - C



为什么固定数组可以工作,但当我尝试使用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 )

然后再试一次。

  1. sizeof(char)总是返回1,buffer的大小应该是100(因为在静态情况下是100)
  2. buffer之前已经是指向char&的指针,这是不必要的,并且将给出指针的地址,而不是buffer指向的地址。(这可能是段故障的原因。)

您正在fscanf中传递指针对指针。只是在fscanf中有缓冲区。在"char buffer[]"的情况下,&缓冲区和缓冲区是等效的。因此,在这种情况下没有seg故障。

请注意,固定数组和动态分配数组的类型不同:

char buffer[100];

与。

char* buffer 

Malloc返回动态分配内存的地址位置,因此不需要在其前面加上"&"。所以简单地使用这个:

while( fscanf(fp, "%s", buffer) != EOF )
{
    .....

相关内容

  • 没有找到相关文章

最新更新