use*_*er7 108 c pointers segmentation-fault
我遇到了以下C拼图:
问:为什么以下程序会在IA-64上发生段错误,但在IA-32上运行良好?
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道int64位机器的大小int可能与指针的大小不同(可能是32位,指针可能是64位).但我不确定这与上述计划有什么关系.有任何想法吗?
Fle*_*exo 125
演员int*掩盖了这样一个事实:没有适当#include的返回类型malloc被认为是int.IA-64恰好具有sizeof(int) < sizeof(int*)明显的问题.
(另请注意,由于未定义的行为,即使在sizeof(int)==sizeof(int*)保持为true 的平台上,它仍然可能失败,例如,如果调用约定使用不同的寄存器来返回指针而不是整数)
该comp.lang.c常见问题有一个条目讨论为什么铸造从返回malloc永远不会需要和可能较坏.
pax*_*blo 31
很可能因为你没有包含头文件malloc而且,虽然编译器通常会警告你这一点,你明确地转换返回值的事实意味着你告诉它你知道你在做什么.
这意味着编译器期望int返回malloc一个然后从中转换为指针.如果它们的尺寸不同,那将会让你感到悲伤.
这就是为什么你从来不投的mallocC中的回报void*,这回报会隐式转换为正确类型的指针(除非你有没有包含在这种情况下,它可能会提醒你的潜在不安全内部-的头指针转换).
这就是为什么你永远不会编译没有关于缺少原型的警告.
这就是你永远不会在C中使用malloc返回的原因.
C++兼容性需要强制转换.没有理由(阅读:没有理由在这里)省略它.
C++兼容性并不总是需要,并且在少数情况下根本不可能,但在大多数情况下很容易实现.