文字配列のリテラルストリングイニシャルイザー
質問
アレイがポインターに崩壊する場合の場合の次のルールで:
式(3つの例外を除いて)に表示されるタイプの配列のlal [質問2.5]のlvalue [3つの例外を除く)は、最初の要素へのポインターになります。結果のポインターのタイプは、ポインタからTです。
(例外は、配列がサイズまたはオペレーターのオペランドである場合、または文字列アレイの文字通りの文字列初期イザーである場合です。)
アレイが「文字アレイのリテラルストリングイニシャルイザー」である場合、ケースを理解する方法は?例を挙げてください。
ありがとう!
解決
配列がポインターに崩壊しない3つの例外は次のとおりです。
例外1。 - アレイがオペランドの場合 sizeof
.
int main()
{
int a[10];
printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */
int* p = a;
printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}
例外2。 - アレイがオペランドの場合 &
オペレーター。
int main()
{
int a[10];
printf("%p", (void*)(&a)); /* prints the array's address */
int* p = a;
printf("%p", (void*)(&p)); /*prints the pointer's address */
}
例外3。 - アレイがリテラル文字列で初期化されている場合。
int main()
{
char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */
char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}
他のヒント
宣言を想定します
char foo[] = "This is a test";
char *bar = "This is a test";
どちらの場合も、文字列リテラルのタイプ」This is a test
"is" 15要素のchar "。ほとんどの状況では、配列式はタイプ「n要素アレイのt」から「tへのポインター」に暗黙的に変換され、式はその最初の要素のアドレスのアドレスに評価されます。配列。の宣言 bar
, 、それがまさに起こることです。
の宣言で foo
, しかし、式は、内容を別の配列を初期化するために使用されているため、 いいえ ポインタータイプに変換されました。代わりに、 コンテンツ 文字列の文字列がコピーされます foo
.
これは、文字アレイ用の文字通りの文字列初期イザーです。
char arr[] = "literal string initializer";
また、そうかもしれません:
char* str = "literal string initializer";
K&R2からの定義:
文字列定数とも呼ばれる文字列の文字列は、「...」のように二重引用符に囲まれた一連の文字です。文字列にはタイプ「文字の配列」とストレージクラスの静的(以下のpar.a.3を参照)があり、指定された文字で初期化されます。同一の文字列リテラルが異なるかどうかは実装定義であり、文字列の文字通りを変更しようとするプログラムの動作は未定義です。
comp.lang.c FAQ(おそらく古いバージョンまたは印刷されたバージョンかもしれません。オンラインの現在の状態とは完全に一致しないかもしれません)からその引用を引いたようです。
http://c-faq.com/aryptr/aryptrequiv.html
対応するセクションは、FAQの他のセクションにリンクして、これらの例外について詳しく説明します。あなたの場合、あなたは次のように見てください: