1

私は次のことを試しました:

int main()
{
    char* a = "sdwgfwegwe wefwef wefwefwefwysadqaw";
    char* b = "acd";
    char* c = "sdwgfwegwe wefwef wefwefwefwysadqaw";
    char* d;

    d = "acd";

    printf("%p\n", a);
    printf("%p\n", b);
    printf("%p\n", c);
    printf("%p\n", d);

    getchar();

    return 0;
}

出力(コンソール)では、aとcはbとdだけでなく同じアドレスを持っていました。すべてのキャラクターにルックアップテーブルを実装することを考えました。それを行う利点/状況はありますか?そして、コンパイラはそれから何を作りますか(ルックアップテーブルではなく、上記の例:))?この文字列がすでに使用されているかどうかを確認し、使用されていない場合は、指定された文字列用にメモリを予約します -> それを a? に返します コンパイラに依存していても、内部メモリの割り当て/管理を説明する本のヒントやリンクはありますか? 前もって感謝します。

4

2 に答える 2

7

文字列リテラルは、C では変更できないように指定されています。

そしてC99の根拠文書から:

「この仕様により、実装は文字列のコピーを同一のテキストと共有し、文字列リテラルを読み取り専用メモリに配置し、特定の最適化を実行できます」

于 2013-01-22T21:39:40.447 に答える
2

C++ の回答 (§2.14.5):

すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納される) かどうかは、実装によって定義されます。

文字列リテラル オブジェクトをどのように作成するかは、完全に実装次第です。ある実装では、別の実装とは異なる方法で行う場合があります。あなたのものは、同一の文字列リテラルを同じオブジェクトとして扱っているようです。

于 2013-01-22T21:43:23.627 に答える