我有以下代码:
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 处没有任何内容,因此导致了分段错误。