使用具有大尺寸参数的malloc时的C - 分段错误

时间:2017-06-08 14:20:38

标签: c arrays segmentation-fault malloc

在分配大尺寸的动态数组时,我遇到了段错误。

作为一个具体示例,以下代码会导致段错误。

int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;

但是,如果我将max替换为像5这样小的东西,那么我就不会遇到段错误。

为什么会这样?或者,是否有其他解决方案可以达到同样的效果?我需要一个动态分配的大小数组。

由于

3 个答案:

答案 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给出了原因。实际上,恢复malloccalloc失败非常棘手。在大多数情况下,像上面那样突然退出是最简单的事情。在某些情况下(想想应该连续运行的服务器程序)你可以做其他事情(但这很难)。

还阅读memory overcommitment(一个完整的系统可配置的东西或功能,我个人不喜欢和禁用,因为它可能会使malloc在内存资源耗尽时显然成功;在Linux上阅读{{ 3}})

另请参阅Out-of-memory killermalloc

的愚蠢实现

顺便说一下,您需要确保(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返回的值。