【问题标题】:Does malloc allocate more than I ask for? [duplicate]malloc 分配的是否超出了我的要求? [复制]
【发布时间】:2014-07-13 17:27:19
【问题描述】:

以下代码打印 1 到 300 之间的所有数字。 怎么不丢丢分段错误?

编译:gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

现在这也不同于malloc(0) actually works?

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
  int *pi = (int *)malloc(1);
  int i = 0;
  for(i = 0;i < 300;i++) {
    *(pi + i) = i + 1;
  }
  for (i=0;i < 300;i++) {
    printf("%d\n", *(pi + i));
  }
  return 0;
}

【问题讨论】:

  • 未定义行为的一种可能表现形式是程序执行您期望的操作。这些是最难纠正的 UB。
  • 这很糟糕,你不应该这样做。只要你幸运,它只会按预期工作。
  • @MohitJain 我会说 不走运
  • 我知道这很糟糕。我很好奇为什么它几乎总是有效。
  • 不会,会导致内存损坏和无法解释的错误

标签: c gcc segmentation-fault malloc


【解决方案1】:

malloc(0) 是实现定义的,它返回一个空指针或一个不能被取消引用的指针。

取消引用 malloc(0) 的结果会调用未定义的行为。

【讨论】:

  • malloc(1) 也可以。
  • @user3004771 这是因为分配器通常会为您提供它可以使用的最小块,并且可以超过 1 个字节。
  • malloc 分配的内容完全由实现定义。但是,您仍然可以通过该内存并且它不会产生分段错误,除非您跨越页面边界到 cpu 未分配区域。
  • @user3004771 (C99, 7.20.3p1) "如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就像大小是一些非零值,除了返回的指针不应用于访问对象。”
  • @user3004771: malloc 正式分配完全您要求的内容,并正式返回指向该大小的内存块的指针。如果它真的多分配了几个字节,那是偶然的。如果你做一些不同的事情,你的程序不会立即崩溃,因为硬件使用 4k 页,因此无法检测到你在几个字节的粒度上对内存的非法使用。
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-07-06
  • 2021-11-27
  • 2014-02-02
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多