我正在读取一个文件(每行1个字)并将每行放入一个数组中。它将要关闭文件时崩溃,并显示(*glibc detected*proj:corrupted double linked list:0x0000000002139240**)。同样,除了第一个元素之外的所有内容都被正确复制了(第一个元素应该是“你好”而不是“0”)。非常感谢您的帮助。

int i = -1;
int numb;
int wsize;
while (fgets(word,30,file)!=NULL)
{
    if (i==-1)
    {
         if(word[strlen(word)-1]=='\n')
         {
             word[strlen(word)-1] = 0;
         }
         numb = atoi(word);
         ptr = malloc(sizeof(char*)*numb);
    }
    else
    {
        if(word[strlen(word)-1]=='\n')
        {
             word[strlen(word)-1] = 0;
        }
        wsize = strlen(word);
        ptr[i] = malloc(sizeof(char*)*wsize);
        strncpy(ptr[i],word,strlen(word));
        size++;
     }
     i++;
}
int j=0;
while(j<16)     //prints to see if they were copied corectly
{               //ptr[0] was the only one that did not copy corectly
    printf("%s\n",ptr[j]);
    j++;
}
fclose(file);
printf("test\n"); //was never printed so I assume it crashes at fclose()
return 1;

最佳答案

ptr[i] = malloc(sizeof(char*)*wsize);错误,原因有二:
它应该是sizeof(char),而不是sizeof(char*)(或者省略这个,因为根据定义sizeof(char)等于1)
如果要存储长度为wsize的字符串,则需要分配wsize+1字节
编辑-更多问题:
此行的目的是什么?你是说size++;
数字16来自哪里?我建议你试试wsize++;
如果while(j<16)返回非零值,则表示发生了错误。将此项更改为while(j<i),除非您有足够的理由返回其他值。
再一个:
我刚刚注意到你在使用main()。这不会在字符串末尾添加终止return 0;字节,因为您要求它使用不超过strncpy()字节复制长度'\0'的字符串。把这条线改成wsize就行了。
完成后,需要从代码中移除所有可能的缓冲区溢出。(有很多。)

10-04 14:57