我有以下代码:
foo((void*)INT_MIN);
然后是函数foo(void* i)
int foo(void* i) {
return *(int*)i;
}
但我得到一个段错误,大概是因为我不能取消引用文字?我错过了什么?
尝试:
int x = INT_MIN;
foo(&x);
int foo(void* i) {
return *(int*)i;
}
您不能INT_MIN
直接获取 的地址,因为它不是常量,而是#define
. 这就像做
foo(l, &(-2147483647 - 1));
请注意,根据架构和编译器,您通常可以执行以下操作:
foo((void*)INT_MIN);
int foo(void* i) {
return (int)i;
}
所以将 anint
转换为 a void*
(在英特尔架构上它可以工作,因为sizeof(void*) >= sizeof(int)
)。它通常被认为是坏事,因为不能保证它可以在其他架构上工作。
请注意两个示例之间的区别。在第一个中, 的地址x
被传递给foo(void*)
,在那里它被转换为一个 int ( int*
) 的地址并被取消引用到一个 int。在第二个中, anint
被转换为 a void*
,然后重新转换为 an int
。
如果要传递文字的地址,可以使用复合文字:
foo(& (int) {INT_MIN});
您将 int 值转换为 (void*) 然后取消引用它。
尝试这个:
int n = INT_MIN;
foo((void*)&n);
例如,在我的系统中,INT_MIN 等于 0x80000000。因此,您将此值作为指针发送给函数,将其作为地址转换为整数,然后尝试获取内存中该位置的值。显然,地址 0x80000000 处没有任何内容,因此导致了分段错误。