2016-09-19 11 views
0

を与える誰かが次のように説明することができます:同じ値を持つ2つの文字列リテラルを印刷すると、同じアドレスに

#include <stdio.h> 

void some_fn(char *x) 
{ 
    printf("%d\n", x); 
} 

int main() 
{ 
    // They are stored on the same memory address 
    some_fn("A"); 
    some_fn("A"); 

    some_fn("B"); 
} 

する理由:

some_fn("A"); 
    some_fn("A"); 

プリントが同じメモリアドレスに格納されていること?

+5

'' A ''は文字列リテラルなので、プログラムの読み取り専用部分に入る可能性が高く、コンパイラは" A "と" A "'が同じであるそれは一度だけ格納し、参照されるときはいつでもそのアドレスを使用します。また、 'printf("%p "...)でポインタを出力してください。 – yano

+1

より良い質問は、*それらを同じアドレスに保存しないでください。 – Barmar

+0

あなたはあなたの関数に 'char'sを渡していません。必要に応じて、 'char'へのポインタを渡しています。これらのポインタは、任意の配列の値が関数の引数として現れるときと同じように、文字列リテラル( 'char'の配列)がポインタに壊れた結果です。 –

答えて

1

最初に、%dを使用してオフにすると、ポインタを編集する前にコードを編集していたものが無効になり、定義されていない動作が発生します。代わりに%pポインタを使用する必要があります。

つまり、some_fnへの2つの呼び出しは、どちらも同じになる文字列リテラルに渡されます。文字列リテラルは通常、メモリの読み取り専用セクションに格納されます。特定の文字列リテラルがコード内に複数回現れると、コンパイラは通常、そのリテラルの単一のインスタンスを使用します。その場合、そのリテラルのアドレスは、別の場所に現れるときは同じです。

+0

訂正していただきありがとうございます。私は本当に元の投稿を編集しました。 これは私が最初に考えたことですが、コンパイラは同じ文字列リテラルの2つに気づいてもメモリを浪費しませんでした。 – dud3

+1

@ dud3回答に記載された訂正で質問を編集しないでください。これにより、投稿全体が混乱しているように見えます。 – 2501

+0

@ 2501ロジャー、すみません、私の悪いです。 – dud3

関連する問題