我是一名学习 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) )
吗?