c++ - 64 个 ASCII 字符的字符串溢出 malloc(64 * sizeof(char))

标签 c++ visual-c++ memory-management console-application

如果我提供一个长度为 64 个十六进制字符的字符串(即:26C8D8AB82B027808A371BC46EA789364AB8419F2B17EADFE955CBE5C6369011),下面的代码会抛出一个错误,即使我为它分配了 64 * sizeof(char) 字节,这应该是够了:

char* username = (char*)malloc(64 * sizeof(char));
std::cin >> username;
free(username);

当我释放分配的内存时,在第三行抛出错误:

CRT detected that the application wrote to memory after end of heap buffer.

对于 63 个或更少的字符,不会发生这种情况。谁能告诉我为什么 64 * sizeof(char) 还不够,为什么在释放内存时抛出错误...

最佳答案

C 字符串以 NULL 结尾。

您没有为终止符留出空间。

释放内存时会检测到错误,因为这是查看对象后的填充并发现它已损坏的函数。如果您禁用内存调试,则可能不会进行任何检查(甚至可能没有填充),并且这种错误可能不会被发现,直到它丢弃完全不相关的数据。

如果您已经知道确切的长度并且不需要终止符来标记结束,您可以使用

cin.read(username, 64);

这不会存储终止符,也不会读取多于(或少于)64 个字符的输入,因此它不会溢出。

关于c++ - 64 个 ASCII 字符的字符串溢出 malloc(64 * sizeof(char)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860652/

相关文章:

c++ - 用于向所有 mpi 进程发送和接收的时间高效设计模型 : MPI all 2 all communication

c++ - MSBuild 在 native 依赖 dll 的内部更改后重新链接每个 native 项目

c++ - Visual C++ STL 是人工生成的还是代码生成的?

c - C链表遍历中移除条目并释放桶节点时出错

c - 仅对共享库使用 Electric Fence (libefence)

c++ - 解析 xml 时无法获取属性的名称和值

c++ - C++ 17静态模板惰性评估

c++ - 为什么 istream 对象可以用作 bool 表达式?

visual-c++ - 获取错误 LNK2019 : unresolved external symbol when compiling SDL2 code in Windows using MSVC

Java线程内存计算