- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
5小时前关门了。
Improve this question
为什么下面的代码在str1 ="Overflow"& str2 ="stack"时检测到抛出堆栈破坏,而在str1 ="stack"& str2 ="Overflow"时却没有?
#include <iostream>
#include<cstring>
using namespace std;
void string_Concat (char *ptr1, const char *ptr2)
{
int length1 = strlen (ptr1);
int length2 = strlen (ptr2);
int i, j;
char *temp = ptr1;
ptr1 = new char[length1 + length2 + 1];
ptr1 = temp;
for (i = length1, j = 0; ptr2[j] != '\0'; i++, j++)
ptr1[i] = ptr2[j];
ptr1[i] = '\0';
}
int
main ()
{
char str1[] = "Overflow";
char str2[] = "stack";
string_Concat (str1, str2);
std::cout << str1 << std::endl;
return 0;
}
输出:堆栈溢出***检测到堆栈损坏***:终止的
在这里,即使输入字符串发生了变化,也不会出现堆栈崩溃的问题,因为我们已经分配了足够的空间。
1条答案
按热度按时间z2acfund1#
这完全是错的,你有很多问题
首先,这个代码:
这只分配了足够的空间来存储字符串加上尾随的空字节。如果你试图追加到它后面,你最终会遇到它后面的任何数据。这是糟糕的。你肯定不能。
然后执行以下代码:
这里发生了什么,temp指向ptr 1的值,然后你为ptr 1分配新的空间--好的,很酷,然后你销毁指针并把它设置回temp --原始的ptr 1,这是一个内存泄漏,什么也做不了。
当然,正确的方法是使用C++字符串,但你只是在学习,所以第二种正确的方法几乎就是你所拥有的。
按照你之前的方式分配空间,把两个字符串都复制到其中,然后返回那个值,就像这样:
总的来说,你会保留返回的指针,然后像之前那样打印出来。