-6

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)都以空结尾。真假?

5) 无论C or C++何时我们创建一个类似的字符串"Hello",它总是以空结尾。假设在C++我们声明string str = "Hello";中,它也是 null Terminated 吗?

编辑

考虑在 main() 中声明的所有。

@Negative 点和关闭请求。我问这个问题是关于它们在哪里存储堆或堆栈?还有空终止。

4

2 回答 2

1

“考虑在 main() 中声明的所有内容。”

然后

1) 是的。

2) 是的。

3) 是,也不是(在常见的实现中,它既不存储在堆栈中,也不存储在堆中)。“即分配 6 个字节”——您似乎忘记了指针所需的内存。此外,在评论和另一个错误的答案中有一个错误的说法char* str= "Hello";,但实际上它是合法的 C 和目前合法的 C++ ...请参阅C 和 C++ 中字符串文字的类型是什么?

4) 是的,但如果您将 10 更改为 5 则会是错误的——也就是说, givenchar str[5]="Hello";不是strNUL 终止的。

5) 假和否(尽管实现可能会在字符串之后存储 NUL —— C++11 需要它——但这不是字符串的一部分)。


“我问这个问题是关于它们在哪里存储堆或堆栈?”

人们从哪里得到这些是唯一类型的记忆的想法?局部变量存储在堆栈中,通过mallocor (非放置)new分配的内存是从堆中分配的。程序代码、文件范围变量和文字都不属于这些类别。

于 2013-05-18T06:23:03.027 回答
0

您正在侧身看这种东西,这可能就是您感到困惑的原因;-)

1) 如果这些变量都在例程定义中声明,没有 static 关键字,那么它们都在堆栈上。

但是 char str[10] 和 char str[] 是数组 - 您可以在堆栈上获得数组的所有字符。char *str 是指向一个或多个字符的指针。只有指针确定在堆栈上。

2) "Hello" 在 C 中总是代表一个以 NULL 结尾的字符串——它有 6 个字符长。如果你想初始化一个字符数组以包含一组不以 NULL 结尾的字符,你不能这样做。

3)正如人们在评论中指出的那样,目前还不清楚是什么char *str = "Hello";,甚至是否合法。如果是char const *str = "Hello";并且编译器接受了它,我希望在某个匿名、全局且可能受保护的地方找到 6 个字符的字符串。

4) 我不知道“字符串”类在 C++ 中的作用。

于 2013-05-18T06:36:06.437 回答