c++ 为什么相同逻辑代码的行为不同?[已关闭]

92vpleto  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(133)

编辑问题以包含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;
}

输出:堆栈溢出***检测到堆栈损坏***:终止的
在这里,即使输入字符串发生了变化,也不会出现堆栈崩溃的问题,因为我们已经分配了足够的空间。

z2acfund

z2acfund1#

这完全是错的,你有很多问题
首先,这个代码:

char str1[] = "...";

这只分配了足够的空间来存储字符串加上尾随的空字节。如果你试图追加到它后面,你最终会遇到它后面的任何数据。这是糟糕的。你肯定不能。
然后执行以下代码:

char *temp = ptr1;
ptr1 = new char[length1 + length2 + 1];
ptr1 = temp;

这里发生了什么,temp指向ptr 1的值,然后你为ptr 1分配新的空间--好的,很酷,然后你销毁指针并把它设置回temp --原始的ptr 1,这是一个内存泄漏,什么也做不了。
当然,正确的方法是使用C++字符串,但你只是在学习,所以第二种正确的方法几乎就是你所拥有的。
按照你之前的方式分配空间,把两个字符串都复制到其中,然后返回那个值,就像这样:

char * stringConcat(const char * str1, const char * str2) {
     // get the lengths
     char * newStr = new char[length1 + length2 + 1];
     // append the two input strings to newStr kind of like what you did
     return newStr;
}

总的来说,你会保留返回的指针,然后像之前那样打印出来。

相关问题