C++ C样式字符串差异:C/C++;
C风格字符串之间有什么区别C++ C样式字符串差异:C/C++;,c++,c,C++,C,C风格字符串之间有什么区别 charstr[10]=“你好” charstr[]=“你好” char*str=“你好” 1) 我相信char str[10]=“Hello”是自动变量并存储在堆栈上。真的吗?i、 e.在堆栈上分配10个字节 2) 是否charstr[]=“Hello”也存储在堆栈上?i、 e.在堆栈上分配6个字节-包括空字符 3) 做char*str=“Hello”将指针str存储在堆栈上,而对象“Hello”存储在堆上?i、 e.在堆上分配6个字节-包括空字符 4) 所有字符串
charstr[10]=“你好”代码>
charstr[]=“你好”代码>
char*str=“你好”代码>
1) 我相信char str[10]=“Hello”
是自动变量并存储在堆栈上。真的吗?i、 e.在堆栈上分配10个字节
2) 是否charstr[]=“Hello”代码>也存储在堆栈上?i、 e.在堆栈上分配6个字节-包括空字符
3) 做char*str=“Hello”
将指针str存储在堆栈上,而对象“Hello”
存储在堆上?i、 e.在堆上分配6个字节-包括空字符
4) 所有字符串(问题1、2和3)
均以空结尾。对/错
5) 无论是C还是C++
每当我们创建一个像“Hello”
这样的字符串时,它总是以null结尾。假设在C++
中,我们声明string str=“Hello”代码>,是否也以null结尾
编辑
考虑main()中声明的所有
@否定点和关闭请求。我问的这个问题是关于它们在堆或堆栈中的存储位置?以及空终止。“考虑main()中声明的所有内容。”
然后
1) 对
2) 对
3) 是和否(它既不存储在堆栈中,也不存储在常见实现中的堆中)。“即分配6个字节”--您似乎忘记了指针所需的内存。另外,在评论和另一个回答中有一个错误的说法是char*str=“Hello”代码>是错误的,但实际上它是合法的C,现在,法律C++…看
4) 是,但如果将10更改为5,则为false——也就是说,给定char str[5]=“Hello”代码>,str
未以NUL结尾
5) False和no(虽然实现可能在字符串后面存储NUL——C++11需要它——但这不是字符串的一部分)
“我问的这个问题是关于它们在堆或堆栈中的存储位置?”
人们从哪里知道这些是唯一的记忆?本地变量存储在堆栈上,通过malloc
或(非放置)new
分配的内存从堆中分配。程序代码、文件范围变量和文本都不属于这两类。您正在从侧面观察这种类型,这可能就是您感到困惑的原因;-)
1) 如果这些变量都在例程定义中声明,没有static关键字,那么它们都在堆栈上
但是char str[10]和char str[]是数组-您可以在堆栈上获取数组的所有字符。
char*str是指向一个或多个字符的指针。只有指针肯定在堆栈上
2) “Hello”在C中始终表示以NULL结尾的字符串-长度为6个字符。如果要初始化一个字符数组以包含一组非空终止的字符,则不能这样做
3) 正如人们在评论中指出的,不清楚什么是char*str=“Hello”代码>是的,甚至它是否合法。如果是char const*str=“Hello”编译器接受了它,我希望在匿名、全局和可能受保护的地方找到6个字符的字符串
4)我对C++中的“string”类做了什么线索。
第三个声明是完全错误的,5取决于哪个C++标准是相关的。这取决于你在哪里声明它们。“第三个声明是错误的”——嗯,怎么会这样?“5取决于哪个C++标准是相关的”——C++ 11命令NUL终止,但实现允许NUL以以前的标准终止。更正:终止一个C++字符串的NUL将被严重破坏。这意味着NUL是字符串值的一部分,而事实并非如此。C++11要求s.C_str()返回&s[0],这完全是另一回事。这意味着实现必须在字符串数据之后分配NUL字节,但这并不意味着用户可以访问NUL。除了@JimBalters answer结尾的rant之外,编译器还可以执行优化。某些优化可能会改变对象的寿命或完全消除它们。这就使得这些问题的任何一个确定的答案都无效。“不清楚什么是代码> char *STR =“hello”;< /C> >,或者甚至它是否合法”——不,它并不完全清楚,它在C和C++中都是合法的;看见