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