LPCSTR 函数的返回值变为垃圾

The return value of a LPCSTR function becomes trashy

本文关键字:返回值 函数 LPCSTR      更新时间:2023-10-16

我正在编写一个简单的XOR加密程序,然后我注意到函数的返回值不是我希望看到的那种。

只是在我的代码中找不到问题,有人可以帮助我吗?

这是程序代码:

#include "windows.h"
#include "iostream"
using namespace std;

LPCSTR hasala(string original, char key){
  string changed;
  for (int temp = 0; temp < original.size(); temp++){
  changed += original[temp] ^ (int(key) + temp) % 255;
  }
  cout << changed.c_str()<<"nn";//works, output "acagaca"
  LPCSTR adart = changed.c_str();
  cout << adart<<"nn";//works, output "acagaca"
  return adart;
}
int main(){
    cout << hasala("abcdefg", 0);//doesn't work, output "||||@ER|||"...
    cout << "nn";
    Sleep(8000);
    return 0;
}

您拥有的指针是堆栈上std::string拥有的内存 - 当std::string超出范围时,它会释放它,然后您读取它。您必须返回std::string,而不是LPCSTR

你返回的是 changed.c_str() ,它只是一个指向由 changed 管理的缓冲区的指针。 changed是一个局部变量,在函数结束时被销毁,因此您最终会返回指向不再存在的内容的指针。

直接返回 std::string changed

您正在返回在堆栈上分配的局部变量。

基本上你的代码可以转换为:

LPCSTR hasala(string original, char key){
string changed;
return changed.c_str();
}

分配内存(调用方必须释放它)或返回 std::string