为什么这段代码在64位架构上进行段错误,但在32位上工作正常?

我遇到了以下的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的返回types被假定为int 。 IA-64碰巧有sizeof(int) < sizeof(int*) ,这个问题很明显。

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

comp.lang.c常见问题解答有一个条目,讨论为什么从malloc转换返回从不需要和可能不好 。

最有可能的原因是你没有包含 malloc的头文件,而编译器通常会提醒你这个事实,而你显式地赋值返回值意味着你告诉它你知道你在做什么。

这意味着编译器需要从malloc返回一个int ,然后将其转换为指针。 如果它们大小不同,那会让你感到悲伤。

这就是为什么你永远不会在C中使用malloc返回。它返回的void*将被隐式转换为正确types的指针(除非你没有包含头部,在这种情况下它可能会警告你潜在的不安全的整型到指针转换)。

这就是为什么你从不编译没有关于缺less原型的警告。

这就是为什么你永远不会在C中投入malloc返回

C ++兼容性需要强制转换。 没有理由(阅读:没有理由)省略它。

C ++兼容性并不总是需要的,在一些情况下根本不可能,但是在大多数情况下很容易实现。