char *变量地址与char []变量地址

时间:2010-12-05 03:10:17

标签: c arrays pointers char

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

  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的地址。

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

5 个答案:

答案 0 :(得分:4)

因为字符串文字,例如“foo bar”分配在比你的char数组“不同的地方”。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

文本“char数组变量中的字符”。并且“这是一个字符串,在飞行中制作。”可能很接近彼此。但是,char charArray[] = ...请求堆栈中的空间,相应的文本位被复制到该空间中。一旦操作系统完成其虚拟化等操作,堆栈实际上与原始硬编码文本的世界不同。

答案 3 :(得分:2)

这是怎么回事 - 我记得在[ Unix:系统编程]

中读到这一点

1 alt text

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

答案 4 :(得分:1)

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

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

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

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

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