[英]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);
錯誤的原因有兩個:
它應該是sizeof(char)
,而不是sizeof(char*)
(或者忽略它,因為sizeof(char)
根據定義等於1)
如果要存儲長度為wsize
的字符串,則需要分配wsize+1
個字節
編輯—更多問題:
行size++;
的目的是什么size++;
? 您是說wsize++;
嗎wsize++;
?
while(j<16)
中的數字16來自哪里? 我建議您改為嘗試while(j<i)
。
如果main()
返回非零值,則表示發生錯誤。 將其更改為return 0;
否則, return 0;
除非您有充分的理由返回其他值。
多一個:
strncpy()
。 這不會在字符串的末尾添加終止的'\\0'
字節,因為您已要求它使用不超過wsize
字節的長度來復制長度為wsize
的字符串。 將此行更改為strcpy(ptr[i],word);
它應該工作。 完成之后,您需要從代碼中消除所有潛在的緩沖區溢出。 (有很多。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.