取消引用void * literal

时间:2013-09-17 18:41:53

标签: c pointers

我有以下代码:

  foo((void*)INT_MIN);

然后是函数foo(void* i)

int foo(void* i) {
  return *(int*)i;
}

但是我得到了一个段错误,大概是因为我无法取消引用字面值?我错过了什么?

4 个答案:

答案 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没有任何内容,因此导致了分段错误。