我是一名学习C++的学生,我正在努力了解以null结尾的字符数组是如何工作的。假设我定义了一个如下的字符数组:
char* str1 = "hello world";
正如预期的那样,strlen(str1)
等于11,并且它是空终止的。
如果上面的char数组的所有11个元素都填充了字符"helloworld",C++将null终止符放在哪里?它是否真的分配了一个长度为12而不是11的数组,其中第12个字符是' '
?CPlusPlus.com似乎表明,11个中的一个需要是' '
,除非它确实分配了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的字符。
然而,如果我这样做:
// Null-terminate the second one
str2[strlen(str1)] = ' ';
// 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) )
会更好吗?
在字符串文字的情况下,编译器实际上为