为什么这段代码在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 ++兼容性并不总是需要的,在一些情况下根本不可能,但是在大多数情况下很容易实现。