C Style Strings差异:C / C ++

时间:2013-05-18 06:02:53

标签: c++ c

C Style Strings之间有什么区别

char str[10]="Hello";

char str[]="Hello";

char* str= "Hello";

1)我相信char str[10]="Hello"是自动变量并存储在stack.True?即在堆栈上分配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";,它是否也为空终止?

修改

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

@Negative积分和关闭请求。我问这个问题关于它们存储堆或堆栈的位置?还有空终止。

2 个答案:

答案 0 :(得分:1)

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

然后

1)是的。

2)是的。

3)是,否(在常见实现中它既不存储在堆栈中也不存储在堆中)。 “即分配6个字节” - 您似乎忘记了指针所需的内存。此外,评论中有错误的声明,另一个答案是char* str= "Hello";是错误的,但实际上它是合法的C,现在,合法的C ++ ......请参阅What is the type of string literals in C and C++?

4)是的,但是如果你将10改为5就错了 - 也就是说,给定char str[5]="Hello";str不是NUL终止的。

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


“我问这个问题关于它们存储堆或堆栈的位置?”

人们在哪里知道这些是唯一的记忆?局部变量存储在堆栈中,通过malloc或(非位置)new分配的内存从堆中分配。程序代码,文件范围变量和文字都不属于这两个类别。

答案 1 :(得分: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)我不知道“string”类在C ++中的作用。