0

也许是一个奇怪的问题..

我目前正在努力理解为什么以下等于 true 即“Hello World”被打印到控制台?我一直认为 C 中的字符串比较必须使用strcmp或类似方法来完成。

char *a = "Hello";
char *b = "Hello";

if(a == b)
{
    printf("Hello World\n");
}

我还认为只有在地址相同的情况下这才等同于真实?它们是文字的事实吗?

PS。是的,这几乎与任务无关,但我只是想出了上面的内容。- 这不会以任何方式回答任务。

4

5 回答 5

5

该语言对字符串文字的存储位置和方式没有任何要求。您所知道的是它们具有静态存储持续时间,并且您不得尝试更改数据。标准中没有任何内容要求两个不同的字符串文字具有不同的地址,并且完全有可能实现对字符串文字数据进行重复数据删除。

另一方面,没有什么要求将两个相同的字符串文字存储在同一个地址,因此比较地址没有什么意义。始终用于strcmp比较字符串的内容

于 2012-09-26T00:58:08.620 回答
3

出于优化目的,您直接放入代码中的相同文字实际上将指向相同的内存位置。

在这种情况下,编译器将“Hello”放在固定内存中一次,然后指向ab内存。

为了更详细地了解发生了什么,我建议你编译这个程序(首先添加一堆字符串文字),然后使用gdb或 valgrind 或任何其他内存检查器并手动查看指向字符串文字的内存 - 你'会发现在标准情况下 gcc 将所有字符串文字放在内存中并重新使用相同的字符串文字。

于 2012-09-26T00:53:54.470 回答
2

a 和 b 是指向字符的指针。

指针基本上存储一个内存地址。您的 a 和 b 变量不保存单词“hello”,但它们保存保存单词“hello”的内存地址。

在程序中打印 a 和 b 以查看它们的值。它看起来像:632176或类似的东西,它们将是平等的。

所以代码a == b基本上说:“a和b指向同一个内存地址吗?”。他们确实这样做了,因为“hello”是一个常量字符串,它只会被写入内存一次。

于 2012-09-26T00:58:14.253 回答
1

这里发生的是你有两个指针,称为*a*b。接下来,如您所知,指针指向特定的内存位置。现在,当两者*a*b都设置为完全相同的句子时,它遵循ab指向一个内存地址。但是,编译器注意到这些指针是同一个句子,因此为了优化目的,它会将它们设置为指向完全相同的内存地址

因此,发生的事情是这样的:

a = 0xFFFFFFFF;
b = 0xFFFFFFFF;
if(0xFFFFFFFF == 0xFFFFFFFF){
    // Code
}

现在,当您比较它们时,编译器将其视为(0xFFFFFFFF == 0xFFFFFFFF)编译器认为它们相等,导致if statement变为真并显示Hello, World

但是,不同的编译器可能不会发生这种情况,因此您可能会在不同的编译器中得到不同的结果。这种行为确实适用于 gcc。因此,在这种情况下,您应该始终使用strcmpfor 比较来避免这样的随机行为。

于 2012-09-26T01:00:26.640 回答
1

我相信如果您有两个指向相同值的指针,编译器只会将两个指针都指向同一块内存。它的效率更高。但在 C 语言中,即使在这种情况下,也总是使用 strcmp。

于 2012-09-26T01:00:36.590 回答