【问题标题】:why different string pointers to the same content have the same adders in c? [duplicate]为什么指向相同内容的不同字符串指针在 c 中具有相同的加法器? [复制]
【发布时间】:2019-04-17 09:43:37
【问题描述】:

我为字符串分配了两个具有相同内容(不是值!)的不同指针,当我打印它们的地址时,我看到它们具有相同的加法器,而无指针字符串具有不同的加法器,有人可以解释为什么会这样吗? 有人告诉我这与字符串文字有关,但我不确定。

char* str1 = "hello";
char* str2 = "hello";
char str3[8] = "hello";

printf("%p %p %p", str1, str2, str3);

输出:

0x01077B30
0x01077B30
0x0107F6E8

【问题讨论】:

    标签: c string pointers


    【解决方案1】:

    当你有一个字符串文字时,实际的字符串存储在一个可能是只读的位置,因此不应修改。 char* 你会得到那个地方的积分。因此,当您多次使用完全相同的文字时,它不需要同一个字符串的多个副本,它可以让它们指向同一个实际字符串。但是,这并不能保证会发生,这取决于编译器。

    另一方面,当你这样做时:

    char str3[8] = "hello";
    

    你在栈上得到了一个字符串的副本,所以这就是它的地址不同的原因。

    【讨论】:

    • 编译器是否会构建某种二叉搜索树,以防程序托管许多不同的 sting 文字进行比较并决定是否分配?
    • @machine_1 我想这里有很多优化的潜力,但标准不需要做任何类似的事情。甚至不能保证两个相等的字符串文字只会在程序中产生一个副本。在我的机器上,当我有两个"hello" 时,它们将返回相同的地址,但如果我有"ello",它会单独存储,即使它位于"Hello" 字符串中。这完全取决于实施。这里有一个很好的问题详细说明:stackoverflow.com/q/52423837/10411602
    • @EricPostpischil 好点。我编辑了答案以反映它不一定是只读的,只是不应该被修改。
    【解决方案2】:

    实际上是您的编译器优化。

    您的编译器决定只为一个字符串字面量"hello" 分配内存,并使str1str2 都指向该内存。鉴于字符串文字的性质(即,不需要修改),这种用法就足够了。

    但是,如果您尝试打印str1str2 的地址,您会发现它们是不同的。

    另一方面,str3 是一个数组,使用字符串文字 "hello" 中的内容进行初始化,这就是它存储在内存中单独位置的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      相关资源
      最近更新 更多