【问题标题】:C - Segmentation Fault when using malloc with large size paramaterC - 使用具有大尺寸参数的 malloc 时出现分段错误
【发布时间】:2017-11-10 07:43:45
【问题描述】:

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

作为一个具体的例子,下面的代码会导致一个段错误。

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

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

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

谢谢

【问题讨论】:

  • 首先,should you really cast the result of malloc?其次,如果malloc 调用失败并返回一个空指针怎么办?您需要为此检查
  • A 代表野心。 A 也是分配。尝试分配 5.6 GB 是一个相当雄心勃勃的分配。
  • 如果算术是使用 64 位数字完成的,您需要大约 5 GiB 的内存。你的系统允许你分配那么多吗?在使用它之前,您必须检查来自malloc() 的返回值。这并不总是足够的(Linux 和 OOM — 内存不足 — 杀手),但它是必要的。
  • 我预感 OP 正试图在 32 位操作系统上执行此操作。

标签: c arrays segmentation-fault malloc


【解决方案1】:

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上阅读Out-of-memory killer

另见thismalloc 的愚蠢实现)

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

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

【讨论】:

  • 如何确定失败的原因?
  • +1 对于 size_tr 建议,即使在编译时知道大小的情况下,每个好的编译器都会在任何溢出的情况下警告您 =)
【解决方案2】:

malloc() 如果无法分配请求的内存,则返回NULL。您应该对照NULL 检查malloc() 返回的值。

【讨论】:

    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2022-01-20
      • 2018-09-24
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多