c - 为什么这段代码在 64 位架构上会出现段错误,但在 32 位架构上却可以正常工作?

标签 c pointers segmentation-fault

我遇到了以下 C 难题:

问:为什么以下程序在 IA-64 上出现段错误,但在 IA-32 上运行正常?

  int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }

我知道 64 位机器上 int 的大小可能与指针的大小不同(int 可以是 32 位,指针可以是64 位)。但我不确定这与上述程序有何关系。 有什么想法吗?

最佳答案

类型转换int*掩盖了这样一个事实:如果没有适当的 #include malloc 的返回类型假设为int 。 IA-64 恰好有 sizeof(int) < sizeof(int*)这使得这个问题变得显而易见。

(另请注意,由于未定义的行为,即使在 sizeof(int)==sizeof(int*) 成立的平台上,它仍然可能失败,例如,如果调用约定使用不同的寄存器来返回指针而不是整数)

comp.lang.c FAQ有一个条目讨论why casting the return from malloc is never needed and potentially bad .

关于c - 为什么这段代码在 64 位架构上会出现段错误,但在 32 位架构上却可以正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21048647/

相关文章:

java - C/C++ 相当于 Java 的 doubleToRawLongBits()

不持有有效地址的 C 程序指针仍然没有给出段错误

c++ - 是否真的使用了使用指针类型实例化模板的能力?

bash - 如何在 Fortran 90 程序中抑制由于 SIGSEGV 或 SIGFPE 引起的输出?

c - 使用指针获取 3D 数组元素的总和

c - 有没有办法回到 typedef 枚举的字符串?

C++:静态指针、静态对象和动态内存分配

c - * 等同于 C 中的 [] 吗?

c++ - 具有相同编译器的相同程序代码会导致不同的二进制文件

c - 将参数传递给函数时 C 中的段错误