在 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);
}
我打算分配一个大小为 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);
}