在分配大尺寸的动态数组时,我遇到了段错误。
作为一个具体示例,以下代码会导致段错误。
int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;
但是,如果我将max替换为像5这样小的东西,那么我就不会遇到段错误。
为什么会这样?或者,是否有其他解决方案可以达到同样的效果?我需要一个动态分配的大小数组。
由于
答案 0 :(得分:6)
Reed documentation of malloc
(或来自Linux手册页的malloc(3))
它可能会失败,然后返回NULL
;并且您的代码应该处理这种情况:
int *arr = malloc((max+1) * sizeof(int));
if (!arr) { perror("malloc arr"); exit(EXIT_FAILURE); };
你可以通过其他方式处理失败,但errno给出了原因。实际上,恢复malloc
或calloc
失败非常棘手。在大多数情况下,像上面那样突然退出是最简单的事情。在某些情况下(想想应该连续运行的服务器程序)你可以做其他事情(但这很难)。
还阅读memory overcommitment(一个完整的系统可配置的东西或功能,我个人不喜欢和禁用,因为它可能会使malloc
在内存资源耗尽时显然成功;在Linux上阅读{{ 3}})
另请参阅Out-of-memory killer(malloc
)
顺便说一下,您需要确保(max+1) * sizeof(int)
没有溢出,并且您最好定义size_t max = 1399469912;
(不是int
)。
请注意,您要求(在我的Linux / x86-64桌面上sizeof(int)==4
的系统上)超过5 GB。这是this的重要数量。
答案 1 :(得分:3)
您必须检查malloc
是否返回有效指针或无法分配内存。在这种情况下,它返回null
。指针。
int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
if( arr == NULL )
{
/* Malloc failed, deal with it */
}else{
//fine here
arr[0] = 1;
}
引用man page
如果成功,则调用calloc(),malloc(),realloc(),reallocf()和valloc() 函数返回指向已分配内存的指针。如果有错误, 它们返回一个NULL指针并将errno设置为ENOMEM。
答案 2 :(得分:2)
malloc()
如果无法分配请求的内存,则返回NULL
。您应该检查malloc()
针对NULL
返回的值。