猿问

为什么此代码段错误在64位体系结构上却在32位体系结构上能正常工作?

我遇到了以下C难题:


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


  int main()

  {

      int* p;

      p = (int*)malloc(sizeof(int));

      *p = 10;

      return 0;

  }

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


长风秋雁
浏览 612回答 3
3回答

潇湘沐

演员以int*掩盖一个事实,即没有正确#include的返回类型malloc被假定为是int。IA-64碰巧有sizeof(int) < sizeof(int*)这个问题,很明显。(还请注意,由于行为未定义,即使在sizeof(int)==sizeof(int*)保持true 的平台上,它仍然可能会失败,例如,如果调用约定使用了不同于整数的指针来返回指针)该comp.lang.c常见问题有一个条目讨论为什么铸造从返回malloc永远不会需要和可能较坏。

翻过高山走不出你

最有可能的原因是,您没有包括和的头文件malloc,而编译器通常会警告您,而您显式转换返回值的事实意味着您告诉它您知道自己在做什么。这意味着编译器期望int返回malloc,然后将其从中转换为指针。如果它们的大小不同,那将使您感到悲伤。这就是为什么您从不将返回值强制转换为mallocC的void*原因。返回的值将隐式转换为正确类型的指针(除非您没有包含标头,在这种情况下,它可能会警告您可能不安全的int-指针转换)。

米脂

这就是为什么您永远不会在没有关于缺少原型的警告的情况下进行编译的原因。这就是为什么您永远不会在C中强制转换malloc返回的原因。C ++兼容性需要强制类型转换。没有什么理由(请阅读:这里没有理由)将其忽略。C ++的兼容性并不总是需要,并且在少数情况下根本不可能的,但在大多数情况下,它是很容易实现的。
随时随地看视频慕课网APP
我要回答