0

filedata を 2 次元配列にロードしようとしていますが、fread を呼び出すと、EXC_BAD_ACCESS エラーが発生します。

これは私が自分のファイルを読み取ろうとしている方法です:

char data[21][23];
FILE* file = fopen("1.txt", "r");
fread(data, 1, sizeof(data), file); // EXC_BAD_ACCESS
4

1 に答える 1

1

C では、2 次元配列 (nxm) は、サイズ m の n 個の配列への n 個のポインターの配列として表されます。

fread は、指定されたポインターが指すメモリー領域を読み取ります。

あなたの場合、 fread は n 個のポインターが格納されるはずの場所にデータを書き込みます。C の 2 次元配列に対して単純に 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];
}

更新: サンプル コードにエラーが含まれていました (64 ビット システムでは sizeof(data) を使用しましたが、これは目的の値の 8 倍を返し、別の EXC_BAD_ACCESS につながります;))

于 2012-05-03T15:33:24.700 に答える