【问题标题】:char * variable address vs. char [] variable addresschar * 变量地址 vs. char [] 变量地址
【发布时间】:2011-05-20 10:05:09
【问题描述】:

我正在从以下两个声明和初始化中打印出地址和字符串:

  char * strPtr = (char *) "This is a string, made on the fly.";
  char charArray [] = "Chars in a char array variable.";

打印时,以下输出出现,变量 charArray 和 strPtr 的地址完全不同。问题是,“为什么?”

印刷:

  printf( "%10s%40s%20p\n", "strPtr", strPtr, &(*strPtr));    
  printf( "%10s%40s%20p\n", "charArray", charArray, charArray);

输出:

    strPtr      This is a string, made on the fly.            0x400880    
 charArray         Chars in a char array variable.      0x7fff12d5ed30

如您所见,不同的地址是:0x400880 与 0x7fff12d5ed30

在此之前声明的其余变量的地址与 charArray 类似。

同样,问题是,“为什么地址如此不同?” 感谢您的帮助。

【问题讨论】:

  • 只是一些建议;声明指向字符串文字的指针更有利,例如const char *str = "string";。这有助于防止尝试修改字符串文字的未定义行为。
  • @dreamlax +1 提供可靠建议

标签: c arrays pointers char


【解决方案1】:

因为字符串字面量,例如“foo bar”被分配在与您的 char 数组“不同的地方”。

依赖于实现,但典型的实现会将字符串文字放入可执行文件的 .rdata(“只读数据”)部分,并且您的 char 数组在本地声明,并且因此进入堆栈。

当图像的不同部分被加载到 RAM 中时,它们将被映射到截然不同的地址。

【讨论】:

    【解决方案2】:

    我猜编译器/链接器将 char 数组放入堆栈,而另一个字符串放入静态字符串表中。

    【讨论】:

      【解决方案3】:

      文本“字符数组变量中的字符”。和“这是一根绳子,是即时制作的。”可能彼此非常接近。但是,char charArray[] = ... 请求堆栈上的空间,将相应的文本位复制到其中。一旦操作系统完成其虚拟化等操作,堆栈实际上与原始硬编码文本处于不同的世界中。

      【讨论】:

        【解决方案4】:

        事情就是这样——我记得在 [Unix: Systems Programming]

        中读到过这个

        1

        如您所见,初始化的静态数据存储在堆上的不同位置,而不是未初始化的静态数据。

        【讨论】:

          【解决方案5】:

          这里要意识到的关键是,在strPtr 的情况下,您正在处理两个 不同的对象,而在charArray 的情况下,您只处理一个

          charArray 是单个数组对象,由"Chars in a char array variable." 字符串的字符填充。

          strPtr 本身是一个单指针对象。它的值是第二个匿名的、不可修改的数组对象的地址,该对象又包含"This is a string, made on the fly." 字符串的字符。

          当您使用%p 打印出charArray 时,您正在打印charArray[0] 的地址(由于数组的特殊规则)。当您打印出&(*strPtr)(与刚才的strPtr 完全相同)时,您正在打印前面提到的匿名、不可修改的数组对象的地址——这就是为什么它看起来与其他变量的地址如此不同的原因参与。

          如果您使用%p 打印出&strPtr,您将看到变量strPtr 本身的地址与其他局部变量的范围相似。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-21
            • 1970-01-01
            • 2021-09-14
            • 1970-01-01
            • 2013-01-30
            • 1970-01-01
            • 2014-04-30
            • 2010-11-18
            相关资源
            最近更新 更多