3

我有一个与 char 指针的动态内存分配有关的奇怪问题。我有类似的东西

char *input = new char; //1
gets(input) //2
char *dest = new char; //3

在第 3 步期间,我在运行时遇到堆损坏错误。仅当我输入的字符串长度超过 23 个字符时才会发生这种情况。

如果我不做任何新的操作,那么就没有问题。

如果我指定,此问题已解决

 char *input = new char[100]; 

但我希望输入根据用户的输入是动态的。

我不确定在这种情况下 24 字节的作用是什么。我不想限制为 100 个或一些 n 个字符...我在内存分配方面有点弱...有人可以解释这种情况吗?

4

5 回答 5

6

不,你不能那样做。您可以仅使用静态缓冲区或使用“cpp-way”,即:

std::string str;
std::getline(std::cin, str);
于 2012-12-24T14:12:47.357 回答
5

您的程序在任何长度大于零的输入上表现出未定义的行为,因为gets添加了一个空终止符。程序不会崩溃多达 23 个字符的事实是一个不幸的巧合。

如果要动态分配缓冲区,请不要使用getsor char-based 输入;相反,将您的数据读入std::string.

于 2012-12-24T14:15:39.303 回答
2

如果您不知道用户将输入什么长度并且您不想限制用户输入,那么您必须分配足够长度的缓冲区。您可以使用 STL 字符串,但它也会为您动态分配足够的内存,它只是将分配细节隐藏到您的程序中。

于 2012-12-24T14:16:59.090 回答
1

永远不要使用gets()(来自手册页):

不检查缓冲区溢出

根据在那里输入的内容,您会遇到缓冲区溢出。

于 2012-12-24T14:14:45.153 回答
0
new char

为一个字符分配内存。它可能在第二个字符之后失败(实际上甚至在第一个字符之后,因为你会得到一个 '\0' 字符。

如果您将问题标记为 C++,而不是 C,请使用 C++!这意味着使用 std::string

于 2012-12-24T14:18:30.603 回答