5

重複の可能性:
文字列リテラルは C でどのようにコンパイルされますか?

以下の小さなコードを書きました。このコードでは、1 番目と 2 番目の「hello」文字列のアドレスが比較されると思います。私はこれで混乱しています。一見すると、両方の文字列が読み取り専用メモリに格納されるため、アドレスが異なると思いました。しかし、実行後に「等しい」が出力されました。

objdump を見たとき、hello という文字列が表示されませんでした。それらを保存するために変数を使用していないことは理解していますが、「こんにちは」はどこに保存されますか。

STACK に保存されますか?? またはコードセグメントに保存されますか??

#include<stdio.h>
int main()
{
    if ("hello" == "hello")
        printf("\n equal ");
    else
        printf("\n not equal");
    return 0;
}

if 条件を に変更すると if ("hello" == "hell1")、「等しくない」と出力されました。繰り返しますが、文字列はどこにどのように格納されますか。STACK に保存されますか?? またはコードセグメントに保存されますか??

ここで誰かが私に精巧な答えをくれたら本当にありがたいです。ありがとう

4

3 に答える 3

3

あなたの特定の例では、「こんにちは」文字列はコードの一部ではありません。コンパイラは、コードが常に「等しい」と出力されることを検出するのに十分なほどスマートであるため、それらを完全に取り除きます。

ただし、コードが次のようになっている場合:

#include<stdio.h>
int main()
{
    const char *h1 = "hello";
    const char *h2 = "hello";
    if (h1 == h2)
        printf("\n equal ");
    else
        printf("\n not equal");
    return 0;
}

ただし、比較は実際に行われます (追加の最適化なしでコンパイルされた場合)。これは最適化です。コンパイラは、ハードコードされた同一の文字列が 2 つあることを検出し、それらを結果のバイナリにマージしました。

一方、コードが次のようになっている場合、コンパイラはそれらが同じであると (デフォルトで) 推測できず、「等しくない」というメッセージが表示されます。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    char *h1 = malloc(sizeof(char) * 10);
    char *h2 = malloc(sizeof(char) * 10);

    strcpy(h1, "hello");
    strcpy(h2, "hello");

    if (h1 == h2)
        printf("\n equal ");
    else
        printf("\n not equal");

    free(h1);
    free(h2);

    return 0;
}
于 2012-05-11T07:28:31.267 に答える