我在下面写了一些小代码。在这段代码中,我认为将比较第一个和第二个“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上吗?
要么
它会存储在代码段吗?
如果有人在这里给我详细解答,我真的很感激。 感谢
答案 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"
可以由编译器在只读存储器中实现,此外,如果值重合,他有权只实现一个这样的文字。
因此,您的比较结果是实现定义的,甚至可能因同一编译器的不同版本或您提供的不同优化选项而异。