15

2 つの質問があります... (私は C を学んでおり、これはばかげた質問かもしれません。お詫びします)

私の質問は、とにかく文字列を宣言することはありますか?

読み取り専用領域に配置され、アレイにコピーされます。このように文字列のアドレスを出力することはCで有効ですか?

printf("%p\n", &"Hello There"); // I tried, it prints some address

そしてこうすることで

printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");

同じ住所を印刷しています。感じているのは、別のアドレスを出力する必要があることです。コンパイラはここで最適化を行っていますか?

4

4 に答える 4

0

は文字列リテラルであり、文字列テーブルで使用できます ( で同じアドレスを取得する"Hello There"理由)。"Hello There"printf

あなたがするとき

char p2[] = "String";

メモリが割り当てられ、「文字列」が新しく作成されたメモリにコピーされます。しかし

char * p3 = "String";読み取り専用セクションを指します。つまり、文字列テーブルです。

この場合、印刷するp3&"String"同じになります。

と を印刷するp2&"String"、別の住所が印刷されます。p2スタックアドレスだからです。

于 2013-09-26T11:59:58.253 に答える