次のような C (linux(x86_64)) のコードがあります。
typedef struct
{
char k[32];
int v;
}ABC;
ABC states[6] = {0};
ABC* get_abc()
{
return &states[5];
}
main() にいる間:
int main()
{
ABC *p = get_abc();
.
.
.
printf("%d\n", p->v);
}
p->v にアクセスしているときに、printf ステートメントでセグメンテーション違反が発生します。gdb からデバッグしようとしましたが、「メモリにアクセスできません」と表示されます。ここで重要なことの 1 つは、このコードをコンパイルすると、gcc がABC *p = get_abc();に関する警告をスローすることです。ポインターを整数から変換しようとしています。ここでの私の質問は、get_abc() から構造体のアドレスを返しているのに、コンパイラがそのような警告を表示するのはなぜですか? なぜコンパイラはそれを整数と見なすのですか? 整数はx86_64でメモリアドレスを保持できないため、この警告によりセグメンテーション違反が発生していると思います。
どんな助けでも大歓迎です。