如果我提供一个长度为 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/