C++ char*str;str=";“你好”;;在没有为字符串分配任何内存的情况下,这是如何工作的?

C++ char*str;str=";“你好”;;在没有为字符串分配任何内存的情况下,这是如何工作的?,c++,c,pointers,memory-management,char-pointer,C++,C,Pointers,Memory Management,Char Pointer,代码: 我有以下两个疑问: 如何存储字符串而不为其分配任何内存str是一个字符指针,指向char变量i的位置。当我添加str=“Hello”我不是在使用来自该位置的5字节4吗 因为,I codestr=&I

代码:

我有以下两个疑问:

  • 如何存储字符串而不为其分配任何内存
    str
    是一个字符指针,指向char变量
    i
    的位置。当我添加
    str=“Hello”我不是在使用来自该位置的
    5
    字节
    4

  • 因为,I code
    str=&Istr
    &i
    不应该有相同的值吗?当我删除
    str=“Hello”语句
    str
    &i
    是相同的。如果
    str
    &i
    是相同的,那么我相信当我说
    str=“Hello”
    时,它应该用
    'H'
    覆盖
    'a'
    ,其余的
    'ello\0'
    进入后续字节

    我认为整个问题在于
    str=“Hello”
    语句。它似乎不像我想的那样工作

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

    文本字符串
    “Hello”
    可能在程序空间的某个地方占用了6个字节的内存。将指针分配给它只是将指针设置为字符串已经存在的位置。它根本不复制字符

    如果要复制字符,则需要使用strcpy
    ,但由于未将指针设置为足够大的可写缓冲区,因此如果设置了,则会导致未定义的行为

  • str
    是指向字符的指针。当你说
    str=&i您将它指向一个int。当您说
    str=“Hello”您正在将str更改为指向存储字符序列“H”、“e”、“l”、“l”、“o”、0的位置

  • 但是你说的是
    str=&i


  • 看起来您还没有完全掌握指针…

    好的,简单地说,每个字符串在C中都是指针

    如果我们使用此选项运行:

    Hello, a, 403064, 28ff0b
    
    当您设置
    str=&i
    时,您正在使
    str
    指向
    i
    。因此,
    i==*str
    &i==str
    都成立

    当您调用
    str=“Hello”
    str
    现在指向一个大小为6的静态分配数组(通常直接驻留在程序代码中)。因为
    str
    是一个指针,当您将其重置为指向新数组时,它不会更改
    i
    。现在,如果不是将
    str
    设置为
    “Hello”
    ,而是将
    *str='Z'
    i
    现在的值为“Z”,而
    str
    仍然指向
    i

    当我说str=“Hello”时,我不是在使用来自位置4的5个字节吗 其中哪些没有分配

    不会。编译器在内存的不同部分(只读部分,但这是对不同问题的回答)中留出6个字节(请记住空终止符)。任务:

    int main() {
        char *str;
        char i='a';
        str = &i;
        str = "Hello";
        printf("%s, %c, %x, %x", str, i, str, &i);
        return 0;
    }
    
    使
    str
    指向这6个字节中第一个字节的位置,即
    H

    因为,我说str=&I;当我 打印它们

    是的,但是在打印任何内容之前,您将
    str设置为指向下一行的其他内容

    首先,如何存储字符串而不为其分配任何内存。str是一个chracter指针,指向char i的存储位置。当我说str=“Hello”时,我不是在使用位置4未分配的5个字节吗

    字符串的内存由编译器分配。我认为标准并没有明确规定编译器必须如何做到这一点。如果对可执行文件运行“strings”,那么应该在其中的某个地方找到“Hello”

    因为,我说str=&I;str和&我打印它们时不应该有相同的值吗?当我删除str=“Hello”语句时,str和&I是相同的。如果str和&i是相同的,那么我相信当我说str=“Hello”时,它应该用“H”覆盖“a”,其余的“ello\0”进入后面的字节


    我认为您缺少的是str=“Hello”不会将字符串复制到str指向的位置。它会更改str指向的位置。“Hello”在内存中,您正在将该内存位置分配给指针。如果要将内存复制到指针,需要使用memcpy()或类似工具

    当编译器遇到字符串文本时,在本例中,内存分配在静态(全局)内存区域中。这个“分配”是在程序执行之前完成的

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

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

    语句
    str=“Hello”
    将编译器预先分配的字符串文本
    “Hello”
    的地址写入变量
    str
    。这与
    i
    的地址完全不同。该赋值根本不会将单词“Hello”中的任何字符移动到任何位置


    TL;DR C中“string”变量的值只是一个指针。分配给字符串变量就是分配一个数字,即一个地址。

    编译器在名为

    当应用程序运行时,它获取这些字节的地址并将它们存储在表示“str”的变量中

    它不必“分配”内存,因为在运行时,程序不必向操作系统请求内存来存储数据
    int main() {
        char *str;
        char i='a';
        str = &i;
        str = "Hello";
        printf("%s, %c, %x, %x", str, i, str, &i);
        return 0;
    }
    
    str = "Hello";
    
    warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    
    const char* str1 = "hello";
    const char* str2 = "hello";