使用malloc的动态数组不起作用,但固定大小不起作用 - C.

时间:2014-04-11 03:41:24

标签: c dynamic segmentation-fault malloc coredump

为什么固定数组有效但是当我尝试使用malloc使其动态化时会产生分段错误?除了* 10之外,我还尝试过各种各样的价值观。这只是使用一个小文件。我需要这个来处理一个90,000字的字典。

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("%s\n", words[i]);
}

fclose(fp);
//free(buffer);

如果需要,我也可以包含addStringToTree。

编辑1

谢谢你修复它的人。不幸的是,我无法获得90,000字的文本文件,仍然会出现seg错误。

4 个答案:

答案 0 :(得分:1)

应该是

fscanf(fp, "%s", buffer) //remove the ampersand

答案 1 :(得分:0)

更改

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指向的地址。 (这可能是段故障的原因。)

答案 2 :(得分:0)

您正在fscanf中传递指向指针的指针。只需在fscanf中有缓冲区。在'char buffer []'的情况下,&缓冲区和缓冲区是等价的。因此在这种情况下没有seg-fault。

答案 3 :(得分:0)

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

char buffer[100];

VS

char* buffer 

Malloc会返回您动态分配的内存的地址位置,因此您无需在其前面添加'&'。所以只需使用它:

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