int main(int argc, char **argv) {
unsigned int ptr1 = *((unsigned int *)(argv[1]));
printf("ptr1 = 0x%x\n", ptr1);
exit(0);
}
これはビデオチュートリアルのコードスニペットです。私はなぜコードが実行時にセグメンテーションフォールトにならないのか分かりません。このCコードスニペットでセグメンテーションフォルトが発生しないのはなぜですか?
(unsigned int *)(argv[1])
これは、プログラムに渡される最初の引数がunsigned intにキャストされるようです。したがって、引数が 'AAAA'の場合、 '0x41414141'はメモリ内のいくつかの場所へのポインタになりました。
これを行うと、*((unsigned int *)(argv[1]))
は、アドレス0x41414141
が指す値を参照していませんか?私が知っていることから、このアドレスはおそらくプロセスによってアクセス可能ではありません。だからどのようにセグメンテーションフォルトが発生しませんか?プログラムの出力は -
ptr1 = 0x41414141
私はgccでLinux上でこのプログラムをコンパイルしています。
'argv [1]'は 'char'データへのポインタを保持しています。ポインタは' unsigned int'データへのポインタとして扱うためにキャストします。あなたは '0x41414141'を逆参照していません。あなたは 'argv [0]'を逆参照していますが、 'unsigned int *'という色付きメガネを使っています。 – WhozCraig