我有以下代码:
foo((void*)INT_MIN);
然后是函数foo(void* i)
int foo(void* i) {
return *(int*)i;
}
但是我得到了一个段错误,大概是因为我无法取消引用字面值?我错过了什么?
答案 0 :(得分:4)
尝试:
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;
}
所以将int
转换为void*
(在英特尔架构上可行,因为sizeof(void*) >= sizeof(int)
)。它通常被认为是不好的,因为不能保证它可以在其他架构上工作。
注意两个例子之间的区别。在第一个地址中,x
的地址被传递给foo(void*)
,其中它被转换为int(int*
)的地址并被解引用到int。在第二个中,int
会投放到void*
,然后重新投放到int
。
答案 1 :(得分:2)
如果要传递文字的地址,可以使用复合文字:
foo(& (int) {INT_MIN});
答案 2 :(得分:0)
您正在将int值转换为(void *),然后将其解除引用。
试试这个:
int n = INT_MIN;
foo((void*)&n);
答案 3 :(得分:0)
例如,在我的系统中,INT_MIN等于0x80000000。因此,您将此值作为指针发送到函数,将其作为地址转换为整数,然后尝试获取内存中该位置的值。显然,地址0x80000000没有任何内容,因此导致了分段错误。