簡體   English   中英

動態2D陣列崩潰

[英]Dynamic 2D array crashes

我正在從文件中讀取(每行占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;

ptr[i] = malloc(sizeof(char*)*wsize); 錯誤的原因有兩個:

  1. 它應該是sizeof(char) ,而不是sizeof(char*) (或者忽略它,因為sizeof(char)根據定義等於1)

  2. 如果要存儲長度為wsize的字符串,則需要分配wsize+1個字節

編輯—更多問題:

  1. size++;的目的是什么size++; 您是說wsize++;wsize++;

  2. while(j<16)中的數字16來自哪里? 我建議您改為嘗試while(j<i)

  3. 如果main()返回非零值,則表示發生錯誤。 將其更改為return 0;否則, return 0; 除非您有充分的理由返回其他值。

多一個:

  1. 我只是注意到您正在使用strncpy() 這不會在字符串的末尾添加終止的'\\0'字節,因為您已要求它使用不超過wsize字節的長度來復制長度為wsize的字符串。 將此行更改為strcpy(ptr[i],word); 它應該工作。

完成之后,您需要從代碼中消除所有潛在的緩沖區溢出。 (有很多。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM