次のコードがあります。
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;
}
int
したがって、 anを a にキャストしますvoid*
(Intel アーキテクチャでは動作します。なぜならsizeof(void*) >= sizeof(int)
)。他のアーキテクチャで動作する保証がないため、通常は何か悪いものと見なされます。
2 つの例の違いに注意してください。最初のものでは、 のアドレスx
が に渡されfoo(void*)
、そこで int ( int*
) のアドレスにキャストされ、int に逆参照されます。2 番目のものでは、 anint
が a にキャストされ、void*
次に an に再キャストされint
ます。
リテラルのアドレスを渡したい場合は、複合リテラルを使用して行うことができます。
foo(& (int) {INT_MIN});
int 値を (void*) にキャストしてから逆参照しています。
これを試して:
int n = INT_MIN;
foo((void*)&n);