IA-64上的Segfault,但不是IA-32上的

时间:2011-03-22 05:10:35

标签: c puzzle

我无法访问original account。如果可能,请主持人合并帐户 这是我的问题。 以下C程序是IA-64的段错误,但在IA-32上运行良好。

int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }

为什么会这样?

3 个答案:

答案 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不支持未对齐的内存访问。