4

整数配列を初期化し、すべての要素を 1 に設定しようとしています。配列の上限を 4294967295、または 32 ビットで可能な最大数にする必要がありますunsigned int

これは私には些細な作業のように思えますし、そうあるべきですが、segfault. ループを空で実行でき、問題なく動作forしているように見えます (ゆっくりではありますが、43 億近くの数値を処理しているので文句は言いません)。ループ内で何らかのアクションを実行しようとすると、問題が発生するようです。私が以下に持っている命令 - primeArray[i] = 1;-segfaultエラーが発生します。私が知る限り、これによって配列がオーバーランすることはありません。その行をコメントアウトすると、いいえsegfault.

もう遅いし、私の疲れた目は単純なものを見逃しているだけかもしれませんが、別のペアを使用できます.

これが私が持っているものです:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>

#define LIMIT 0xFFFFFFFF;

int main(int argc, char const *argv[])
{
    uint32_t i;

    uint32_t numberOfPrimes = LIMIT;        // hardcoded for debugging
    int *primeArray = (int*) malloc(numberOfPrimes * sizeof(int));

    for (i = 0; i < numberOfPrimes; ++i) {
        primeArray[i] = 1;
    }
}
4

2 に答える 2

10

からの戻りコードを調べてmalloc()、配列が実際に割り当てられたことを確認してください。次のテストは失敗すると思われます。

int *primeArray = (int*) malloc(numberOfPrimes * sizeof(int));

if (primeArray != NULL) {  /* check that array was allocated */
    for (i = 0; i < numberOfPrimes; ++i) {
        primeArray[i] = 1;
    }
}
于 2013-03-10T08:43:07.967 に答える
5

あなたのmalloc呼び出しは、システムから 16 ギガバイトのメモリを要求します。十分な空き仮想メモリがない場合、または 32 ビット システムで実行している場合、呼び出しは失敗します。の失敗をチェックしない場合malloc、コードと同様に、配列は になりNULL、その要素への後続のアクセスはセグメンテーション違反を引き起こします。

本当に大きな配列で作業する必要がある場合は、大量のメモリを備えた 64 ビット システムを入手するか、プログラムを書き直してより小さなワーキング セットで動作し、残りをディスクに保持する必要があります。

于 2013-03-10T08:50:42.020 に答える