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

intしたがって、 anを a にキャストしますvoid*(Intel アーキテクチャでは動作します。なぜならsizeof(void*) >= sizeof(int))。他のアーキテクチャで動作する保証がないため、通常は何か悪いものと見なされます。

2 つの例の違いに注意してください。最初のものでは、 のアドレスxが に渡されfoo(void*)、そこで int ( int*) のアドレスにキャストされ、int に逆参照されます。2 番目のものでは、 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 に答える