使用strcpy_s写入缓冲区后free时触发heap corruption detected错误求助
问题分析与解决
堆损坏的原因
你用strcpy_s(buf + 5, sizeof(char) * 11, "apple")时,给的size参数是整个缓冲区的总大小11,但buf+5指向的起始位置到缓冲区末尾的实际可用空间只有6字节(对应索引5到10,共6个内存位置)。strcpy_s会误以为目标缓冲区有11字节可用,写入时越界修改了堆的元数据,触发堆损坏检测。
缓冲区过小的原因
"apple"是5个字符,但C字符串必须以'\0'结尾,strcpy_s需要把这5个字符加终止符一起写入,总共需要6字节的缓冲区空间。你传入的size=5无法容纳这些内容,所以提示缓冲区太小。
正确写法
直接计算buf+5位置的可用缓冲区大小:总长度11减去已用的5字节,得到6字节,正好能容纳"apple"加终止符。修改后的代码如下:
char* buf = (char*)malloc(sizeof(char) * 11); for (int i = 0; i < 5; i++) buf[i] = '?'; // 目标缓冲区大小为总长度减去偏移量,即6字节 strcpy_s(buf + 5, 6, "apple"); // 这行可省略,strcpy_s会自动添加终止符到buf[10] // buf[10] = '\0'; printf(buf); free(buf);
内容的提问来源于stack exchange,提问作者Cool_Cornflakes
相关产品推荐
相关产品推荐

