char指针的动态内存分配

时间:2012-12-24 14:09:59

标签: c++ memory gets

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

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

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

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

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

 char *input = new char[100]; 

但我希望输入是基于用户输入的动态。

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

5 个答案:

答案 0 :(得分:6)

不,你不能这样做。 您只能使用静态缓冲区或使用“cpp-way”,即:

std::string str;
std::getline(std::cin, str);

答案 1 :(得分:5)

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

如果要动态分配缓冲区,请不要使用基于getschar的输入;相反,请将您的数据读入std::string

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

  

不执行缓冲区溢出检查

根据输入的内容,您会收到缓冲区溢出。

答案 4 :(得分:0)

new char

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

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