在 C 中分配大型数组时出现分段错误

Segmentation fault in allocating a large array in C

我打算分配一个大小为 1073741824 的大数组(例如相当于 1GB),然后随机读取它,但我得到分段错误(核心已转储),因为我只定义了我检查过的数组喜欢:

unsigned int size = 1073741824;
short arr = malloc(size * sizeof(short));

我也试过按如下方式转换它,但仍然是同样的问题:

unsigned int size = 1073741824;
short *arr = (short*) malloc(size * sizeof(short));

还有 ulimit 命令 returns unlimited

所以我做错了什么?

我认为你的问题是函数 malloc returns NULL 由于数组的大小。直接使用 malloc 很容易出错。因此最好使用像这样的宏函数:

#include <stdio.h>
#include <stdlib.h>

#define NEW_ARRAY(ptr, length) \
{ \
        (ptr) = malloc((size_t) (length) * sizeof (ptr)[0]); \
        if ((ptr) == NULL) { \
                fputs("error: Memory exhausted\n", stderr); \
                exit(EXIT_FAILURE); \
        } \
}


int main(void)
{
    unsigned int arrLen = 1073741824;
    short *arr;

    NEW_ARRAY(arr, arrLen);
    /*...*/
    free(arr);
    return 0;
}

您的问题的可能原因是 malloc() 无法在您的系统上分配接近 2GB 的内存。您必须检查 return 值:如果 malloc() 失败,它 return 是一个无法取消引用的 NULL 指针。

此外,您的第一个代码片段将 arr 定义为 short 而不是 short *

这是您应该使用的典型代码模式:

    unsigned int size = 1073741824;
    short *arr = malloc(size * sizeof(short));
    if (arr == NULL) {
        fprintf("cannot allocate memory for %u shorts\n", size);
        exit(1);
    }