我有一个与char指针的动态内存分配有关的奇怪问题。 我有类似的东西
char *input = new char; //1
gets(input) //2
char *dest = new char; //3
在step3期间,我在运行时遇到堆损坏错误。只有当我输入的字符串长度超过23个字符时才会发生这种情况。
如果我不做任何新操作,那就没有问题。
如果我指定,则解决此问题
char *input = new char[100];
但我希望输入是基于用户输入的动态。
我不确定在这种情况下24字节的作用是什么。我不想限制为100或者n个字符...我在内存分配方面有点弱......有人可以解释这种情况吗?
答案 0 :(得分:6)
不,你不能这样做。 您只能使用静态缓冲区或使用“cpp-way”,即:
std::string str;
std::getline(std::cin, str);
答案 1 :(得分:5)
您的程序在输入任何大于零的长度时都会显示未定义的行为,因为gets
添加了一个空终止符。程序不会崩溃多达23个字符的事实是一个不幸的巧合。
如果要动态分配缓冲区,请不要使用基于gets
或char
的输入;相反,请将您的数据读入std::string
。
答案 2 :(得分:2)
如果您不知道用户输入的长度并且您不想限制用户输入,则必须分配足够长度的缓冲区。您可以使用STL字符串,但它也会为您动态分配足够的内存,它只是将分配详细信息隐藏到您的程序中。
答案 3 :(得分:1)
永远不要使用gets()
(来自手册页):
不执行缓冲区溢出检查
根据输入的内容,您会收到缓冲区溢出。
答案 4 :(得分:0)
new char
为一个字符分配内存。它可能在第二个字符之后失败(实际上甚至在第一个字符之后,因为你将获得'\ 0'字符。
如果您将问题标记为C ++而不是C,请使用C ++!这意味着使用std :: string