我想加載filedata到2d數組,但是當調用fread時,我得到一個EXC_BAD_ACCESS錯誤。EXC_BAD_ACCESS當讀取文件數據到二維數組
這是我在嘗試讀我的文件:
char data[21][23];
FILE* file = fopen("1.txt", "r");
fread(data, 1, sizeof(data), file); // EXC_BAD_ACCESS
我想加載filedata到2d數組,但是當調用fread時,我得到一個EXC_BAD_ACCESS錯誤。EXC_BAD_ACCESS當讀取文件數據到二維數組
這是我在嘗試讀我的文件:
char data[21][23];
FILE* file = fopen("1.txt", "r");
fread(data, 1, sizeof(data), file); // EXC_BAD_ACCESS
在C中,2維陣列(n×m個)被表示爲n個指針的數組的大小m×n個陣列。
fread會讀入指定指針指向的內存區域。
在你的情況下,fread會將數據寫入n個指針應該存儲的位置。您不能簡單地在C中的二維數組上使用fread()或任何類似的方法。相反,首先讀入大小爲m * n的1維數組,然後將指針複製到'行的開始處'變成指針數組:
char tmp[21*23];
FILE* file = fopen("1.txt", "r");
fread(tmp, 1, sizeof(tmp), file);
char* data[21];
int i;
for(i = 0; i < sizeof(data)/sizeof(char*); i++) {
data[i] = &tmp[23*i];
}
更新:樣本代碼包含一個錯誤(I使用的sizeof(數據),其中,在64位系統中,將返回的8倍所希望的值,從而導致另一個EXC_BAD_ACCESS;))
在fread上仍然收到EXC_BAD_ACCESS錯誤。在做了更多的研究後,我發現它只發生在ios上,就像我之前推測的那樣。 – Kurt
這個答案和刪除的答案一樣好。緩衝區是一維數組還是二維數組是完全不相關的。 –
除了一件小事情之外,不能說出這裏有什麼問題......你應該使用「rb」,而不是「r」。等等,是'file == NULL'? –
用rb替換r,似乎對問題沒有任何影響。文件不是NULL。 – Kurt
數據被任何機會聲明爲'const'?或者,它是一個局部變量,並且由於嵌套的函數調用和/或其他本地變量(大型數組/結構體)過多而導致堆棧耗盡? –