我从以下两个声明和初始化中打印出地址和字符串:
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的地址。
同样,问题是,"为什么地址如此不同?" 感谢您的帮助。
答案 0 :(得分:4)
因为字符串文字,例如“foo bar”分配在比你的char数组“不同的地方”。
这是依赖于实现的,但是典型的实现会将字符串文字放在可执行文件的.rdata
(“只读数据”)部分中,并且您的char数组在本地声明,因此进入堆栈。
当图像的不同部分加载到RAM中时,它们将被映射到截然不同的地址。
答案 1 :(得分:3)
我猜测编译器/链接器将char数组放在堆栈上,而另一个字符串放入静态字符串表中。
答案 2 :(得分:2)
文本“char数组变量中的字符”。并且“这是一个字符串,在飞行中制作。”可能很接近彼此。但是,char charArray[] = ...
请求堆栈中的空间,相应的文本位被复制到该空间中。一旦操作系统完成其虚拟化等操作,堆栈实际上与原始硬编码文本的世界不同。
答案 3 :(得分:2)
答案 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
本身的地址与其他本地变量的范围相似。