【发布时间】:2012-04-20 11:16:11
【问题描述】:
我是一名学习 C++ 的学生,我正在尝试了解以空字符结尾的字符数组的工作原理。假设我像这样定义一个 char 数组:
char* str1 = "hello world";
正如预期的那样,strlen(str1) 等于 11,并且以空值结尾。
如果上述 char 数组的 11 个元素都用字符“hello world”填充,C++ 将空终止符放在哪里?它实际上是否分配了一个长度为 12 而不是 11 的数组,第 12 个字符是'\0'? CPlusPlus.com 似乎暗示 11 个中的一个必须是 '\0',除非它确实分配了 12 个。
假设我执行以下操作:
// Create a new char array
char* str2 = (char*) malloc( strlen(str1) );
// Copy the first one to the second one
strncpy( str2, str1, strlen(str1) );
// Output the second one
cout << "Str2: " << str2 << endl;
这会输出Str2: hello worldatcomY╗°g♠↕,我假设它是C++ 读取指针char* str2 指向的位置的内存,直到遇到它解释为空字符的内容。
但是,如果我这样做:
// Null-terminate the second one
str2[strlen(str1)] = '\0';
// Output the second one again
cout << "Terminated Str2: " << str2 << endl;
它按预期输出Terminated Str2: hello world。
但是写入str2[11] 是否意味着我们在str2 分配的内存空间之外写入,因为str2[11] 是第12 个字节,但我们只分配了11 个字节?
运行此代码似乎不会导致任何编译器警告或运行时错误。这在实践中安全吗?使用malloc( strlen(str1) + 1 )而不是malloc( strlen(str1) )会更好吗?
【问题讨论】:
-
不,11 个字符之一确实是
\0... 开玩笑 :-) -
既然你在学习,重要的是你从一开始就知道你正在学习的东西的名称。表达式
char* str1 = "hello world";没有定义字符数组,而是一个指向文字的指针(顺便说一下,从const char*到char*的转换已被弃用,因此编译器应该已经警告过你了)。 literal 本身是一个由 constant 字符组成的 array,带有一个空终止符,但您定义的变量是一个 pointer.
标签: c++ arrays char null-terminated