当分配大尺寸的动态数组时,我正在遇到segfault。
作为特定示例,以下代码导致segfault。
int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;
但是,如果我用较小的东西替换了max,那么我就没有segfault。
为什么会发生这种情况?或者,还有另一种解决方案可以实现相同的效果吗?我需要一个动态分配的显着尺寸的数组。
谢谢
malloc
的reed文档(或linux man page的malloc(3((
它可能会失败,然后返回NULL
;并且您的代码应处理这种情况:
int *arr = malloc((max+1) * sizeof(int));
if (!arr) { perror("malloc arr"); exit(EXIT_FAILURE); };
您可以以其他方式处理失败,但是Errno给出了原因。实际上,恢复malloc
或calloc
故障非常棘手。在大多数情况下,像上述突然退出是最简单的事情。在某些情况下(想想应该连续运行的服务器程序(,您可以执行(但这是困难(。
还可以读取有关内存过度承诺(我个人不喜欢和禁用的整个系统可配置的东西或功能的整个系统或功能,因为它可能会使malloc
显然在记忆资源精疲力尽时显然成功;在Linux上,请阅读有关模式外杀手的信息(
另请参见此(malloc
的愚蠢实现(
顺便说一句,您需要确保(max+1) * sizeof(int)
并没有溢出,并且更好地定义size_t max = 1399469912;
(不是int
(。
请注意,您要请求(在具有sizeof(int)==4
的系统(如我的Linux/X86-64桌面(上(超过五吉布。这是大量的虚拟地址空间。
您必须检查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(( 功能返回指向分配的内存的指针。如果有错误, 他们将无效指针返回并将Errno设置为Inomem。
malloc()
如果无法分配请求的内存,则返回NULL
。您应该检查malloc()
对NULL
返回的值。