【发布时间】:2018-07-03 05:36:33
【问题描述】:
编辑:问题不是未定义的行为,而是字符数组的“误用”
我在指针和动态内存分配方面工作不多,所以我决定尝试使用这些方法制作一个非常简单的加密器。 (这个加密器不应该很好,它使用凯撒方法,只有 +1 而不是 3,并且在字母之间使用符号使其更难解密,这里不是批评算法) em>
我认为我面临的问题是未定义的行为,但我真的不明白这是怎么发生的。假设我想加密“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;
}
作为旁注,我确实意识到向量可能更适合此目的,但我还没有深入了解,这是为了练习内存管理。
【问题讨论】:
-
@Someprogrammerdude 不,我不完全明白为什么这是 UB 我自己,我所说的无响应是它在“我”之后停止,我无法点击进入关闭程序(这是我使用
cin.get()的),关闭它的唯一方法是通过任务管理器,或者VS中的停止按钮 -
它永远不会进入 if (i == str.size()) ,因为您在 for 循环中声明了 i
-
与您的问题有些无关:您为什么使用原始字符指针?
enc函数应该返回string而不是char*。 -
@MichaelWalz 我知道这看起来很奇怪,我也不想这样做,但正如我在 Werner Henze 的回答中所说的那样“我起初厌倦了
enc返回字符串,但我不知道如何初始化一个动态大小的字符串,所以我选择了 char。” -
我也不想用大量问题(我确实有)让这篇文章超载,因为它变得太不确定和太宽泛了,我想我可以尝试自己解决其余的问题或单独制作一个,关于这些事情的更深入的问题
标签: c++ memory undefined-behavior