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
吗
str=&I当我打印时,str
和&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";