2010-12-05 77 views
2

我从以下两个声明和初始化打印出地址和字符串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那样。

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

+4

只是一些建议;声明指向字符串文字的指针更为有利,例如`const char * str =“string”;`。这有助于防止试图修改字符串文字的未定义行为。 – dreamlax 2010-12-05 03:33:04

回答

3

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

4

因为字符串文字,例如“foo bar”被分配到一个“不同的地方”,而不是你的char数组。

这是实现相关,但典型的实现将会把字符串字面量在.rdata(“只读数据”)的可执行文件的部分,你的字符数组的局部声明,并因此进入堆叠上。

当你的图片加载到RAM中时,你的图片的不同部分将被映射到大不相同的地址。

2

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

2

这是怎么回事 - 我记得在[Unix:Systems Programming]

1alt text

,你可以看到初始化的静态数据都存储在不同的位置上堆相对于未初始化的静态数据。

1

在这里实现的关键一点是,在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本身的地址与其他本地变量的范围相似。