动态2D阵列崩溃

时间:2015-04-01 01:14:13

标签: c arrays malloc

我正在从一个文件中读取(每行输出1个字)并将每一行放入一个数组中。它即将关闭文件时崩溃( * glibc检测到* proj:损坏的双链表: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;

1 个答案:

答案 0 :(得分:0)

ptr[i] = malloc(sizeof(char*)*wsize);行是错误的,原因有两个:

  1. 它应该是sizeof(char),而不是sizeof(char*)(或者只是忽略这一点,因为根据定义,sizeof(char)等于1)

  2. 如果要存储长度为wsize的字符串,则需要分配wsize+1字节

  3. 编辑 - 更多问题:

    1. 该行size++;的目的是什么?您的意思是wsize++;吗?

    2. 16号来自while(j<16)?我建议您尝试使用while(j<i)

    3. 如果main()返回非零值,则表示发生了错误。将此更改为return 0;,除非您有充分理由返回其他值。

    4. 再一次:

      1. 我刚刚注意到你正在使用strncpy()。这不会在字符串末尾添加终止'\0'字节,因为您已要求它使用不超过wsize个字节来复制长度为wsize的字符串。将此行更改为strcpy(ptr[i],word);,它应该有效。
      2. 完成后,您需要从代码中删除所有潜在的缓冲区溢出。 (它们很多。)