A i*_*ion 0 c arrays malloc segmentation-fault
在分配大尺寸的动态数组时,我遇到了段错误.
作为一个具体示例,以下代码会导致段错误.
int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;
Run Code Online (Sandbox Code Playgroud)
但是,如果我用5之类的小东西替换max,那么我就不会遇到段错误.
为什么会这样?或者,是否有其他解决方案可以达到同样的效果?我需要一个动态分配的大小数组.
谢谢
来自Linux手册页的malloc(或malloc(3)的 Reed 文档)
它可能会失败,然后返回NULL; 并且您的代码应该处理这种情况:
int *arr = malloc((max+1) * sizeof(int));
if (!arr) { perror("malloc arr"); exit(EXIT_FAILURE); };
Run Code Online (Sandbox Code Playgroud)
您可以通过其他方式处理故障,但是errno给出了原因.在实践中,恢复malloc或calloc失败是非常棘手的.在大多数情况下,像上面那样突然退出是最简单的事情.在某些情况下(想想应该连续运行的服务器程序),你可以做其他事情(但这很困难).
另请阅读内存过量使用(整个系统可配置的东西或功能,我个人不喜欢和禁用,因为它可能会malloc在内存资源耗尽时显然成功;在Linux上读取内存不足的杀手)
另见这个(愚蠢的实现malloc)
顺便说一下,你需要确保(max+1) * sizeof(int)没有溢出,你最好定义size_t max = 1399469912;(不是int).
请注意,您(在具有sizeof(int)==4类似我的Linux/x86-64桌面的系统上)请求超过5千兆字节.这是一个很大的虚拟地址空间.