char*str; STR = "HELLO"; 如果没有为字符串分配任何内存,它如何工作?

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)

我有两个疑问:

  1. 如何在不为其分配任何内存的情况下存储字符串.str是一个字符指针,指向char变量的位置i.当我添加str = "Hello";不是我使用5那个位置4没有分配的字节?

  2. 因为,我的代码str = &i;不应该str&i具有相同的值时,我的printf呢?当我删除str = "Hello";声明str并且&i是相同的.而如果str&i是相同的话,我相信,当我说str = "Hello"这应该覆盖'a''H'其余'ello\0'进入后续字节.

    我相信整个问题都是str = "Hello"陈述.它似乎没有像我想的那样工作.

请有人解释它是如何工作的?

Ray*_*oal 7

当编译器遇到字符串文字时,在这种情况下"Hello",内存在静态(全局)内存区域中分配.这个"分配"在程序执行之前完成.

当程序开始执行时main,分配一个堆栈帧来存储main:str和的局部变量i.请注意,这str是一个只存储地址的简单变量.它不存储任何字符.它只存储一个指针.

该语句str = &i;写入的变量str的地址i.

声明str = "Hello"写入变量str,字符串常量的地址"Hello"已经由编译器预分配.这是一个完全不同的地址i.该赋值不会移动单词"Hello"中的任何字符.

TL; DR C中"string"变量的值只是一个指针.分配给字符串变量是指定一个数字,即地址.