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

wha*_*cko 6 c puzzle

我无法访问我的原始帐户.如果可能,请主持人合并帐户.
这是我的问题.以下C程序是IA-64的段错误,但在IA-32上工作正常.

int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Chr*_*Wue 8

在C中,默认的返回类型是int函数不是原型.在ia64中,指针的大小大于int,因此它可以是段错误的.

更新:问题基本上是为什么你应该总是为你的函数建立原型(或者包括相应的标题).


Pra*_*rav 2

malloc我能想到的原因之一是考虑到 99 之前的编译器缺少 原型。

隐式 int (返回类型)已被弃用。但是,如果您的代码出现段错误,则意味着编译器假定函数(作用域内没有任何原型)默认返回整数。结果malloc将被视为返回整数而不是指针。

在 32 位实现上sizeof(int)sizeof(void*)每个都是 32 位。在 64 位上的实现sizeof(int)仍然相同,但是sizeof(void*)64 位。

将 64 位指针截断为 32 位可能会导致该问题。

包括<stdlib.h>解决问题。

  • 好捕获。由于没有包含相关的头文件,因此 `int`/`void*` 不匹配是一个不错的选择。 (2认同)