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) 所有字符串

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) 所有字符串
(问题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”

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++中都是合法的;看见