我遇到了以下 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/