我无法访问original account。如果可能,请主持人合并帐户 这是我的问题。 以下C程序是IA-64的段错误,但在IA-32上运行良好。
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
为什么会这样?
答案 0 :(得分:8)
在C中,如果函数不是原型,则默认返回类型为int
。在ia64中,指针的大小大于int,因此它可以是段错误。
更新:问题基本上就是为什么你应该总是对你的功能进行原型设计(或者包含适当的标题)。
答案 1 :(得分:2)
我能想到的一个原因是考虑到99编译器之前缺少malloc
的原型。
不推荐使用隐式int(返回类型)。但是,如果您的代码段错误,则意味着编译器假定函数(范围内没有任何原型)默认返回整数。因此,malloc
将被视为返回整数而不是指针。
在32位实现上sizeof(int)
和sizeof(void*)
各为32位。在64位实现上sizeof(int)
仍然相同,但sizeof(void*)
是64位。
将64位指针固定到32位可能会导致该问题。
包含<stdlib.h>
以解决问题。
答案 2 :(得分:1)
因为它是IA64(itanic)而不是x64,它可能是基本的,如malloc
不保证对齐,参见memalign
和早期版本的IA64不支持未对齐的内存访问。