c++ - C 风格字符串差异 : C/C++

标签 c++ c

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/

相关文章:

c++ - 派生类中使用的基本构造函数有问题

时间:2019-05-01 标签:c++: variadic template and function overloading

使用 C 指针和结构的链表程序中的冲突类型错误消息

c++ - 将 vector 的 vector 复制到一维数组中

c++ - 为什么基于范围的 for 循环会使我的 C++ 程序崩溃?

c++ - 如何更改 C++ 引用(通过任何必要的方式)

c - 使用 Eclipse 进行 C 编程?

c - C 中的回文字符串

C:通过 argv[] 将文件名加载到结构中,但我不想要文件类型(例如 .txt)?

c - 从 C 到 D 的数组指针