c ++动态分配初始值

时间:2014-09-05 00:52:13

标签: c++ string heap-memory dynamic-memory-allocation strcat

我试图将两个字符串连接成一个新字符串(finalString),如下所示: finalString = string1 +'&' + string2

首先,我为finalString分配内存,然后使用strcat()。

finalString = new char[strlen(string1 ) + strlen(string2) + 2];

cout << finalString  << endl;

finalString = strcat(finalString , string1 );
finalString = strcat(finalString , "&");
finalString = strcat(finalString , string2);

cout << finalString  << endl;

我认为string1是&#34; Mixt&#34;和string2是&#34;超市&#34;。

输出如下:

═════════════════řřřř     //(which has 21 characters)
═════════════════řřřřMixt&Supermarket

我知道如果我在&#34;新字母&#34;中使用圆括号字符串将被初始化为0并且我将得到所需的结果,但我的问题是为什么第一个输出有21个字符,假设我只分配了17个。即便如此,为什么最终的字符串长度超过了初始分配大小(21> 17)?

提前致谢!

3 个答案:

答案 0 :(得分:0)

作为一个不同的答案,为什么不使用std::string

std::string a, b, c;
a = "part1";
b = "part2";
c = a + " & " + b;
std::cout << c << '\n';

part1 & part2

实例:http://ideone.com/pjqz9T

它会让你的生活更轻松!您应该始终使用带有c++的stl类型。

如果您确实需要char *,那么最后您可以c.c_str()

答案 1 :(得分:0)

您的字符串未初始化,导致未定义的行为。在strcat中,当找到空字符时,将附加字符串。

所以,正如其他人已经提到过的,要么你能做到 finalString[0] = 0;

或代替您的第一个strcat使用strcpy。这将复制第一个字符串并在结尾处放置一个空字符。

  

为什么21个字符?

这是由于未定义的行为。它将继续打印,直到它找不到null,否则它会在尝试访问任何非法内存时崩溃。

答案 2 :(得分:0)

两个字为你“缓冲区溢出”

最初有21个字符的原因是因为有一个'/ 0'(也称为null)字符,与finalString指向的内存地址相差22个字符。根据你记忆中的内容,这可能是也可能不一致。

至于为什么你有一个比你想要的更长的原因你在初始缓冲区之外写入随机存储器。你没有崩溃,因为你没有写过重要的东西。

strcat将获取给定的内存地址,找到它找到的第一个'/ 0',并从其上的那个位置将复制您提供的第二个内存指针中的数据,直到它找到第一个'/ 0'。

你所做的是非常危险的,如果你在击中重要事件之前没有击中/ 0',你将导致崩溃或至少是不良行为。

C / C ++中的下划线char []只是指向第一个元素的初始内存位置的指针。没有SAFEGUARDS!你一个人一定要小心..

如果你设置了finalString [0] = 0的第一个字符,那么你的逻辑会更好。