LPCSTR 函数的返回值变为垃圾
The return value of a LPCSTR function becomes trashy
我正在编写一个简单的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
相关文章:
- 从python中调用C++函数并获取返回值
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 编写以 C++ 为单位返回值的函数
- 了解在返回值之前和之后使用 EAX 的函数调用
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 如何将不可移动和不可复制的函数返回值获取到数组中
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 为什么当你将函数的返回值乘以零时它不会短路?
- 函数的返回值类型是别名 ***或 *** 布尔值
- 如何在没有返回值的情况下使用(特征)unaryExpr 和 lambda 函数?
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 为什么这个"ctypes"包装函数的返回值是"c_long(0)"而不是&quo
- 函数不显示返回值 - C++
- 结构新手,我对如何从 void 函数中返回值并将其放入另一个函数感到困惑
- 将 void 函数更改为返回值函数
- 返回值函数中结构成员赋值的额外拷贝