C 样式字符串之间有什么区别
char str[10]="Hello";
char str[]="Hello";
char* str= "Hello";
1) 我相信 char str[10]="Hello"
是自动变量并存储在堆栈中。正确吗?即分配10 bytes
在堆栈上。
2) 是否char str[]="Hello";
也存储在堆栈中?即分配6 bytes - including null character
在堆栈上。
3) 是否char* str= "Hello";
将指针 str 存储在堆栈和对象 "Hello"
上存储在堆上?即分配6 bytes - including null character
在堆上。
4) 所有字符串 (in question 1,2 and 3)
是 null 终止的。对/错?
5)是否是C or C++
每当我们创建像 "Hello"
这样的字符串时,它总是以空终止。假设在 C++
我们声明string str = "Hello";
,是否也为 null 终止?
编辑
考虑在 main() 中声明的所有内容。
@负分和关闭请求。我问这个问题是关于它们存储在堆还是堆栈的位置?还有空终止。
最佳答案
“考虑在 main() 中声明的所有内容。”
然后
1)是的。
2)是的。
3) 是,也不是(在常见实现中它既不存储在堆栈中,也不存储在堆中)。 “即分配 6 个字节”——您似乎忘记了指针所需的内存。另外,评论和另一个答案中有一个错误的说法,即 char* str= "Hello";
是错误的,但实际上它是合法的 C,而且目前是合法的 C++ ...参见What is the type of string literals in C and C++?
4) 正确,但如果将 10 更改为 5,则结果为 false - 也就是说,给定 char str[5]="Hello";
, str
不是以 NUL 结尾。
5) False 和 no(尽管实现可能会在字符串后面存储一个 NUL —— C++11 需要它 —— 但这不是字符串的一部分)。
<小时/>“我问这个问题是关于它们存储在堆还是堆栈的位置?”
人们从哪里知道这些是唯一的内存类型?局部变量存储在堆栈上,通过 malloc
分配的内存或(非放置)new
从堆中分配。程序代码、文件范围变量和文字不属于这些类别。
关于c++ - C 风格字符串差异 : C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16621245/