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命令也返回unlimited

那么我做错了什么?

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

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

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

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

我认为您的问题是函数malloc由于数组太大而返回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 exhaustedn", stderr); 
exit(EXIT_FAILURE); 
} 
}

int main(void)
{
unsigned int arrLen = 1073741824;
short *arr;
NEW_ARRAY(arr, arrLen);
/*...*/
free(arr);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新