gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:36 25 4
gpt4 key购买 nike

我在分配大型动态数组时遇到了段错误。

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

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

但是,如果我将 max 替换为更小的值(如 5),则不会出现段错误。

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

谢谢

最佳答案

里德 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 上阅读关于 Out-of-memory killer )

另见 this (malloc 的愚蠢实现)

顺便说一句,你需要确保 (max+1) * sizeof(int) 没有溢出,你最好定义 size_t max = 1399469912; (不是 int)。

请注意,您正在请求(在具有 sizeof(int)==4 的系统上,例如我的 Linux/x86-64 桌面)超过 5 GB。这是一个很大的数量 virtual address space .

关于C - 使用具有大尺寸参数的 malloc 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44438317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com