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积分和关闭请求。我问这个问题关于它们存储堆或堆栈的位置?还有空终止。
答案 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 ++中的作用。