char指针的动态内存分配

Kar*_*Rao 3 c++ memory gets

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

char *input = new char; //1
gets(input) //2
char *dest = new char; //3
Run Code Online (Sandbox Code Playgroud)

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

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

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

 char *input = new char[100]; 

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

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

kas*_*sak 6

不,你不能这样做.您可以只使用静态缓冲区或使用"cpp-way",即:

std::string str;
std::getline(std::cin, str);
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

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

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

  • @ karthikkumar24当然,它是:你的编译器中`new`的实现在你只要求一个时就会给你24个字节,作为减少碎片的方法.在不同的编译器上,附加大小将不同,并且可能小到零.该标准禁止您读取或写入超出分配的边界,因此理论上即使您读取一个字符,程序也可能崩溃.像这样的错误很难找到,因为程序通常不会崩溃(这就是为什么我称它为一个不幸的巧合).你需要valgrind来发现这样的错误. (3认同)