5

可能的重复:
如何在 C 中编译字符串文字?

我写了下面的小代码。在这段代码中,我认为将比较第一个和第二个“hello”字符串的地址。我对此感到困惑。乍一看,我认为这两个字符串都将存储在只读内存中,因此会有不同的地址。但是执行后会打印“相等”。

当我看到 objdump 时,我看不到字符串 hello。我知道我没有使用变量来存储它们,但是“你好”会存储在哪里。

它会存储在堆栈上吗?还是将其存储在代码段中?

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

当我将 if 条件更改为 时 if ("hello" == "hell1"),打印了“不等于”。同样,字符串的存储位置和方式。它会存储在堆栈上吗?还是将其存储在代码段中?

如果有人在这里给我详细的答案,我将不胜感激。谢谢

4

3 回答 3

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;
}
于 2012-05-11T07:28:31.267 回答
1

如果两个字符串比较相等,例如“hello”==“hello”,则正如 Pavan Manjunath 所说,main 中根本没有比较。组装如下:

    .file“你好.c”
    .section .rodata
.LC0:
    .string "\n 等于 "
    。文本
.globl 主要
    .type 主要,@function

但是如果这两个字符串不相等,比如"hello2" == "hello",那么编译器会在.rodata中为它们分配内存,从acembly看来,如下:

    .file“你好.c”
    .section .rodata
.LC0:
    .string "hello2"
.LC1:
    .string "你好"
于 2012-05-11T08:23:31.103 回答
0

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

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

于 2012-05-11T08:23:10.340 回答