地址比较和字符串存储

时间:2012-05-11 07:24:04

标签: c

  

可能重复:
  How are string literals compiled in C?

我在下面写了一些小代码。在这段代码中,我认为将比较第一个和第二个“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上吗? 要么 它会存储在代码段吗?

如果有人在这里给我详细解答,我真的很感激。 感谢

3 个答案:

答案 0 :(得分:3)

在您的特定示例中,“hello”字符串甚至不是代码的一部分。编译器足够智能,可以检测到代码将永远和永远打印“相等”,因此它会完全剥离它们。

但是,如果您的代码看起来像这样:

#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;
}

仍然得到“相等”,但是,实际上会进行比较(编译时没有额外的优化)。这是一个优化 - 编译器检测到您有两个相同的硬编码字符串,并将它们合并到生成的二进制文件中。

然而,如果您的代码看起来像这样,编译器将无法猜测(默认情况下)它们是相同的,并且您将看到“不相等”的消息:

#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;
}

答案 1 :(得分:1)

如果两个字符串比较相等,如“hello”==“hello”,则主要没有比较,如Pavan Manjunath所说。汇编如下:

    .file   "hello.c"
    .section    .rodata
.LC0:
    .string "\n equal "
    .text
.globl main
    .type   main, @function

但是如果这两个字符串不相等,比如“hello2”==“hello”,那么编译器会在.rodata中为它们分配内存,似乎来自accembly,如下所示:

    .file   "hello.c"
    .section    .rodata
.LC0:
    .string "hello2"
.LC1:
    .string "hello"

答案 2 :(得分:0)

字符串文字,因为你的两个"hello"可以由编译器在只读存储器中实现,此外,如果值重合,他有权只实现一个这样的文字。

因此,您的比较结果是实现定义的,甚至可能因同一编译器的不同版本或您提供的不同优化选项而异。