单字符c风格的字符串充斥着垃圾

Rav*_*ven 2 c++ string char

遗憾的是我无法弄清楚关于c ++这样的基本事情,但是c风格的字符串正在按照我的预期行事.例如,我创建它像这样: char* cstr = new char[1];

它被初始化为:Íýýýýý«««««««««îţ.像往常一样,我可以设置第一个char,因为其他人并不存在(或者我认为它们不存在).在使用白色c风格字符串的同时,所有这些垃圾都被嵌入,一切正常.

现在我把std :: string和那些c-stlye混合了,我得到的是一团糟.惠特这段代码:

std::string str = "aaa";

str += cstr;

char* cstr = new char[1];

std::string str = "aaa";

str += cstr;

我最终决定:aaaÍýýýýý««««««««îţ,但现在这些字符实际存在为string.size()返回长度,包括这个垃圾.

我找不到为什么会发生这种情况,但必须连接whit string创建,因为像char*cstr ="aaa"这样的东西导致aaa没有任何额外的垃圾,但尝试更改字符串初始化这种方式会导致内存访问违规.有人能解释一下这种行为吗?谢谢!

PS:我的JavaScript无法加载,所以如果有人可以正确格式化这篇文章,我会很高兴!

答:天啊!我怎么能忘记这一点...感谢所有的,好的,立即回答.最好的一个来自minitech,所以我会在我的java脚本加载时将其标记为答案:/

Ry-*_*Ry- 6

所有C风格的字符串都以空值终止.因此,使用初始化的字符串new char[1]会使空格中没有字符.你不能将第一个字符设置为任何东西\0,否则正常的字符串操作将一直读入内存,直到它们找到零.所以请new char[2]改用.


Bri*_*eal 5

使用C风格的字符串时,您需要使用null终止符:

char* cstr = new char[2];
cstr[0] = 'X';
cstr[1] = '\0';
Run Code Online (Sandbox Code Playgroud)

说了这么多,做上面的代码真的很糟糕.只是使用,std::string除非你有一个很好的理由.它会为您处理内存分配和解除分配.