gpt4 book ai didi

c++ - 函数返回指针的未定义行为

转载 作者:行者123 更新时间:2023-11-27 23:48:47 24 4
gpt4 key购买 nike

编辑:问题不是未定义的行为,而是字符数组的“误用”

我在指针和动态内存分配方面的工作不多,所以我决定尝试使用这些方法制作一个非常简单的加密器。(这个加密器不应该是伟大的,它使用Caesars方法,只有+1而不是3,并且在字母之间使用符号使它更难解密,这里不是批评算法)

我认为我面临的问题是未定义的行为,但我真的不明白这是怎么发生的。假设我想对“Hello”进行加密,它只打印字母表中“H”之后的“I”,但它停在那里并且程序变得无响应,所以我想问题出在 else for 循环的一部分。编译器还会警告我有关堆损坏的信息,但在查看此页面后,我认为我正在正确释放内存。

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

char * enc(string);

int main()
{
string foo = "Hello";

char * bar = enc(foo);

cout << *bar;

delete[] bar;

cin.get();

return 0;
}

char * enc(string str)
{
char * encrypted = new char[int(str.size())];
srand(unsigned int(time(NULL)));

// Disguise symbols for obscurifying text
char * disg = new char[37]
{
//37 symbols, unrelevant and takes a lot of space.
};

for (int i = 0; i < str.size(); i++)
{
encrypted[i] = int(str[i]) + 1;
if (i == str.size())
break;
else
encrypted[i + 1] = disg[rand() % 37];
}

delete[] disg;

return encrypted;
}

作为旁注,我确实意识到 vector 可能更适合此目的,但我还没有深入探讨,这是为了练习内存管理。

最佳答案

让我们仔细看看 enc 函数中的循环:

for (int i = 0; i < str.size(); i++)
{
encrypted[i] = int(str[i]) + 1;
if (i == str.size())
break;
else
encrypted[i + 1] = disg[rand() % 37];
}

循环将使用 i0 迭代到 str.size() - 1(含)。这意味着循环内的条件 i == str.size()永远为真,并且您将在最后一次迭代中写入越界else 子句中。

解决方案是将 if 中的条件更改为 i == str.size() - 1


还有一些其他问题,但不会像上面那样导致UB。例如,您写入 encrypted[i + 1] 的值将在下一次迭代中被覆盖。

关于c++ - 函数返回指针的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48417997/

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