Sau*_*tha 3 c c++ pointers memory-management char-pointer
码:
#include <stdio.h>
int main() {
char *str;
char i = 'a';
str = &i;
str = "Hello";
printf("%s, %c, %x, %x", str, i, str, &i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
Hello, a, 403064, 28ff0b
Run Code Online (Sandbox Code Playgroud)
我有两个疑问:
如何在不为其分配任何内存的情况下存储字符串.str是一个字符指针,指向char变量的位置i.当我添加str = "Hello";不是我使用5那个位置4没有分配的字节?
因为,我的代码str = &i;不应该str与&i具有相同的值时,我的printf呢?当我删除str = "Hello";声明str并且&i是相同的.而如果str和&i是相同的话,我相信,当我说str = "Hello"这应该覆盖'a'与'H'其余'ello\0'进入后续字节.
我相信整个问题都是str = "Hello"陈述.它似乎没有像我想的那样工作.
请有人解释它是如何工作的?
当编译器遇到字符串文字时,在这种情况下"Hello",内存在静态(全局)内存区域中分配.这个"分配"在程序执行之前完成.
当程序开始执行时main,分配一个堆栈帧来存储main:str和的局部变量i.请注意,这str是一个只存储地址的简单变量.它不存储任何字符.它只存储一个指针.
该语句str = &i;写入的变量str的地址i.
声明str = "Hello"写入变量str,字符串常量的地址"Hello"已经由编译器预分配.这是一个完全不同的地址i.该赋值不会移动单词"Hello"中的任何字符.
TL; DR C中"string"变量的值只是一个指针.分配给字符串变量是指定一个数字,即地址.