1

我有以下代码:

  foo((void*)INT_MIN);

然后是函数foo(void* i)

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

但我得到一个段错误,大概是因为我不能取消引用文字?我错过了什么?

4

4 回答 4

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;
}

所以将 anint转换为 a void*(在英特尔架构上它可以工作,因为sizeof(void*) >= sizeof(int))。它通常被认为是坏事,因为不能保证它可以在其他架构上工作。

请注意两个示例之间的区别。在第一个中, 的地址x被传递给foo(void*),在那里它被转换为一个 int ( int*) 的地址并被取消引用到一个 int。在第二个中, anint被转换为 a void*,然后重新转换为 an int

于 2013-09-17T18:43:37.350 回答
2

如果要传递文字的地址,可以使用复合文字:

foo(& (int) {INT_MIN});
于 2013-09-17T18:45:12.270 回答
1

您将 int 值转换为 (void*) 然后取消引用它。

尝试这个:

int n = INT_MIN;
foo((void*)&n);
于 2013-09-17T18:45:44.090 回答
0

例如,在我的系统中,INT_MIN 等于 0x80000000。因此,您将此值作为指针发送给函数,将其作为地址转换为整数,然后尝试获取内存中该位置的值。显然,地址 0x80000000 处没有任何内容,因此导致了分段错误。

于 2013-09-17T18:50:57.873 回答