对C中的字符串char *的值感到困惑

问题描述

据我在C语言中了解,char * x等于字符串x中第一个char的地址。 在下面的代码示例中,当我在调试器中运行程序时,l和m的值始终是相同的地址,并且条件语句为true:

int main(void)
{

    char *l = "hello";

    char *m = "hello";

    if (l == m)
        printf("true");
}

我不明白为什么两个变量总是具有相同的值(地址)

解决方法

根据C标准(6.4.5字符串文字)

7 如果这些数组的数组不相同,则不确定 元素具有适当的值。如果程序尝试执行以下操作: 修改这样的数组,行为是不确定的。

因此,编译器可以将相同的字符串文字存储为一个字符串文字或单独的字符串文字。通常,编译器会提供一个选项,允许用户选择如何存储字符串文字。

似乎您使用的编译器默认将相同的字符串文字存储为一个字符串文字。您可能会通过以下方式想象情况

char string_literal_hello[] = { 'h','e','l','o','\0' };

int main(void)
{

    char *l = string_literal_hello;

    char *m = string_literal_hello;

    if (l == m)
        printf("true");
}

因此,两个指针lm都指向编译器存储在字符串文字池中的字符数组'h'的相同字符string_literal_hello

,

您正在比较l和m中的地址值,并使用像这样的常量,编译器选择了相同的地址,因为值相同。

将其更改为此,“ l”和“ m”将包含不同的地址,并且不会打印tru。

char l[] = "hello";

char m[] = "hello";