gpt4 book ai didi

C++动态分配初始值

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:44 25 4
gpt4 key购买 nike

我正在尝试将两个字符串连接成一个新字符串 (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 是“Mixt”,string2 是“Supermarket”。

输出看起来像这样:

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

我知道如果我在“new char”中使用圆括号,字符串将被初始化为 0,我会得到想要的结果,但我的问题是为什么第一个输出有 21 个字符,假设我只分配了17. 即使如此,为什么最终的字符串长度会超过初始分配大小 (21 > 17)?

提前致谢!

最佳答案

给你两个词“缓冲区溢出”

最初有 21 个字符的原因是因为在距离 finalString 指向的内存地址 22 个字符处有一个 '/0'(也称为 null)字符。根据您的内存,这可能一致也可能不一致。

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

strcat 将采用给定的内存地址,找到它找到的第一个 '/0',然后从那个地方复制你提供的第二个内存指针的数据,直到它在那里找到第一个 '/0'。

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

Undersand 在 C/C++ 中,char[] 只是指向第一个元素的初始内存位置的指针。没有安全措施!你一个人必须小心..

如果您将 finalString[0] 的第一个字符设置为 0,那么您的逻辑将运行得更好。

关于C++动态分配初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25677116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com