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 GB 的内存。如果您没有那么多可用的虚拟内存,或者如果您在任何 32 位系统上运行,则调用将失败。如果您不检查 的失败malloc,因为您的代码没有检查,则数组将是NULL并且任何后续对其元素的访问都将导致分段错误。

如果你真的需要处理这么大的数组,你要么需要一个具有大量内存的 64 位系统,要么重写你的程序以使用较小的工作集,然后将其余部分保存到磁盘。

于 2013-03-10T08:50:42.020 回答