当前位置: 首页 > 知识库问答 >
问题:

对 C 中的字符串值(字符 *)感到困惑 [重复]

通建安
2023-03-14

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

int main(void)
{

    char *l = "hello";

    char *m = "hello";

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

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

共有2个答案

翁凯定
2023-03-14

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

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

char l[] = "hello";

char m[] = "hello";
赏开宇
2023-03-14

从 C 标准(6.4.5 字符串文本)

7如果这些数组的元素具有适当的值,则不确定这些数组是否不同。如果程序试图修改这样的数组,行为是未定义的。

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

默认情况下,您使用的编译器似乎将相同的字符串文字存储为一个字符串文字。你可以用下面的方式想象这种情况

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

int main(void)
{

    char *l = string_literal_hello;

    char *m = string_literal_hello;

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

因此,指针< code>l和< code>m都指向编译器存储在字符串文字池中的字符数组< code > string _ literal _ hello 的同一个字符< code>'h'。

 类似资料:
  • 我有这段代码,其中这个内联变量

  • 问题内容: 我知道“ ==”比较引用,并且Java字符串是不可变的,并且使用字符串池缓存,但是在这个示例上我仍然感到困惑: 这给了我结果: 我仍然很困惑为什么System.out.println(name1 == name2); 给我一个错误,因为我知道两个值都应该缓存在字符串池中? 问题答案: 因为是final并使用文字字符串初始化,所以它是一个常量表达式。 所以指令 编译为 编译成 因此,在字

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

  • 问题内容: 我已经在eclipse中创建了一个项目,并添加了Maven依赖项。在Eclipse中,它表示我正在使用JRE 1.5。一切在Eclipse中都可以正常运行,例如,我可以运行测试。 当我尝试从终端运行时,出现以下错误。 …在-source 1.3中不支持泛型(使用-source 5或更高版本来启用泛型)… 看来,Maven认为我正在使用JRE 1.3,并且无法识别泛型或for-each循

  • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该