IA-64 上出现段错误,但 IA-32 上没有
我无法访问我的原始帐户。如果可能的话,请版主合并帐户。
这是我的问题。 以下 C 程序在 IA-64 上出现段错误,但在 IA-32 上运行良好。
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
为什么会出现这样的情况呢?
I can't access my original account. Moderators are requested to merge the accounts if possible.
Here is my question.
The following C program segfaults of IA-64, but works fine on IA-32.
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
Why does it happen so?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 C 中,如果函数未原型化,则默认返回类型为
int
。在 ia64 中,指针的大小大于 int,因此可能会出现段错误。更新:问题基本上是为什么您应该始终对函数进行原型设计(或包含与此相关的适当标头)。
In C the default return type is
int
if the function is not prototyped. In ia64 the size of a pointer is larger than an int and so it can segfault.Update: The question is basically why you should always prototype your functions (or include the appropriate headers for that matter).
我能想到的原因之一是,考虑到 99 之前的编译器,
malloc
的原型缺失了。隐式 int (返回类型)已被弃用。但是,如果您的代码出现段错误,则意味着编译器假定函数(作用域内没有任何原型)默认返回整数。因此,
malloc
将被视为返回整数而不是指针。在 32 位实现上,
sizeof(int)
和sizeof(void*)
各为 32 位。在 64 位实现上,sizeof(int)
仍然相同,但sizeof(void*)
是 64 位。将 64 位指针截断为 32 位可能会导致该问题。
包含
即可解决问题。One of the reasons I could think of is that the prototype of
malloc
is missing considering pre 99 compiler.Implicit int (return type) is deprecated. However if your code segfaults that means the compiler assumes that functions (without any prototype in scope) return integer by default. As a result
malloc
would be treated as returning an integer instead of a pointer.On 32 bit implementations
sizeof(int)
andsizeof(void*)
is 32 bits each. On 64 bit implementationssizeof(int)
is still the same butsizeof(void*)
is 64 bits.Trucation of 64 bits pointer to 32 bits might be causing that problem.
Include
<stdlib.h>
to solve the problem.由于它是 IA64 (itanic) 而不是 x64,它可能是一些基本的东西,例如
malloc
不保证对齐,参见。memalign
和 IA64 的早期版本不支持未对齐的内存访问。As it's IA64 (itanic) and not x64 it's probably something basic like
malloc
not guaranteeing alignment, cf.memalign
and early versions of IA64 don't support unaligned memory access.