Char指针给了我一些非常奇怪的字符

时间:2013-09-29 16:19:37

标签: c++

当我运行示例代码时,wordLength为7(因此输出7)。但是我的char数组在最后得到了一些非常奇怪的字符。

wordLength = word.length();

cout << wordLength;

char * wordchar = new char[wordLength]; //new char[7]; ??

for (int i = 0; i < word.length(); i++) //0-6 = 7
{
    wordchar[i] = 'a';
}

cout << wordchar;

输出:7aaaaaaa²²²²|||||||||||||

所需的输出是:aaaaaaa ......它背后的垃圾是什么?那是怎么结束的呢?

4 个答案:

答案 0 :(得分:5)

您应该在\0的末尾添加wordchar

char * wordchar = new char[wordLength +1];
//add chars as you have done
wordchar[wordLength] = `\0`

原因是C字符串以空值终止。

答案 1 :(得分:3)

C字符串以标记其结尾的'\ 0'字符终止(相反,C ++ std::string仅分别存储长度。)

在将字符复制到wordchar时,您没有终止字符串,因此,当operator<<输出wordchar时,它会继续,直到找到第一个\0字符恰好位于wordchar指向的内存位置之后,并且在此过程中它会打印恰好位于内存中的所有垃圾值。

要解决问题,您应该:

  1. 使分配的字符串1 char更长;
  2. 在最后添加\0字符。
  3. 但是,在C ++中,您通常只想使用std::string

答案 2 :(得分:1)

使用: -

char * wordchar = new char[wordLength+1]; // 1 extra for null character

在for循环和

之前

wordchar[i] ='\0'

在for循环之后,C字符串以空值终止。

如果没有它,它会继续打印,直到找到第一个空字符,打印所有垃圾值。

答案 3 :(得分:1)

你避免了尾随零,这就是原因。

在C和C ++中,整个生态系统处理字符串长度的方式是假定尾随零('\0'或简单0数字)。这与例如pascal字符串不同,其中内存表示以数字开头,该数字表示下一个字符包含特定字符串的数量。

因此,如果您要存储某个字符串内容,则必须为尾随零分配一个额外字节。如果你操纵内存内容,你将始终记住尾随零并保留它。否则strstr和其他字符串操作函数可以在运行轨道时改变内存内容并继续处理以下内存部分。没有尾随零strlen也会给出错误的结果,它也会计算,直到它遇到第一个零。

您不是唯一犯这个错误的人,它经常在安全漏洞及其漏洞中扮演重要角色。该漏洞利用了功能消失的副作用,并操纵了最初预期的其他东西。这是C的一个非常重要和危险的部分。

在C ++中(当你标记你的问题时)你最好使用STL的std::string和STL方法而不是C风格的操作。