1

正方行列を宣言しようとしていますが、行/列の値が 1446 より大きいセグメンテーション違反が発生しています。この値は「手動バイナリ検索」を行っていることがわかりました。

これが私のコードのスニペットです:

boolean matrix[vertex][vertex];
memset(matrix, 0, sizeof(matrizAdjacencia[0][0]) * vertex * vertex);

最初の実行では、32768*32768 の位置を宣言しようとしていました。しかし、それは失敗し、この 1446 の値が見つかるまで低い値を修正し始めました。コードは memset(); の前に失敗します。

ブール型は単なる

typedef enum {true, false} boolean;

gdb をアタッチしてプログラムを実行すると、次のエラーが生成されます。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5f3ff548
0x00007fff8e6a5fba in tzload ()

前もって感謝します、

4

1 に答える 1

3

これは、システムのスタック サイズ制限が原因である可能性があります。ulimit -s8MB のほとんどのシステムでどれを参照してください。

つまり、enum が int のサイズを取るため、1446 * 1446 * 4ほとんどです。そのため、許可されているスタック サイズを超えて割り当てることはできません。実際に必要なメモリは約 4GB です。必要なメモリを削減することを扱っているため、おそらくを使用できます。最初に to を変更すると、 toおよび fromがビット フィールドに還元されます。8MB32768 * 32768 * 4bitmapbooleanintchar4GB / 4 = 1GBchar1GB / 8 = 128MB

mallocまたはを使用してcalloc、より大きなメモリのチャンクを優先します。

于 2013-09-16T11:29:18.793 に答える