如果我提供的字符串长度为64个字符的十六进制(即:26C8D8AB82B027808A371BC46EA789364AB8419F2B17EADFE955CBE5C6369011),则下面的代码会抛出错误,即使我为它分配了64 * sizeof(char)字节,够:
char* username = (char*)malloc(64 * sizeof(char));
std::cin >> username;
free(username);
当我释放分配的内存时,第三行会抛出错误:
CRT检测到应用程序在堆结束后写入内存 缓冲液中。
63个字符或更少字符不会发生这种情况。任何人都可以告诉我为什么64 * sizeof(char)是不够的,为什么在释放内存之前抛出错误...
答案 0 :(得分:4)
C字符串以NULL结尾。
你没有为终结者留出空间。
释放内存时检测到错误,因为这是查看对象后面的填充并发现它已损坏的函数。如果你禁用内存调试,可能没有任何检查(甚至可能没有填充),这种错误可能会被检测到,直到它破坏完全不相关的数据。
如果您已经知道确切的长度并且不需要终止符来标记结尾,则可以使用
cin.read(username, 64);
这不会存储终结符,也不会读取超过64个字符的输入(或更少),因此不会溢出。
答案 1 :(得分:1)
C样式字符串必须包含比您尝试添加的字符数多一个char
,以便为终止空字符留出空间。
答案 2 :(得分:1)
你忽略了字符串末尾的NUL CHAR('\0'
)......
你应该为最大长度为64的字符串分配65个字节