我有这个密码:
char z[9];
Int_To_BCD(vInt, z);
Buflen += sprintf(BufStr + Buflen, "(%s)", z);
以及:
void Int_To_BCD(Int val,char*out){
int i = 0;
int j = 0;
int outIndex = 0;
unsigned char digits[4];
unsigned char Digit[2];
memcpy((void*)digits, (void*)&val, 4);
for (i = 0; i <= 3; i++) {
Digit[0] = (digits[i] & HIGH) / 16;
Digit[1] = digits[i] & LOW;
for (j = 0; j < 2; j++) {
sprintf(&(out[outIndex]), "%d", Digit[j]);
outIndex++;
}
}
if (outIndex == 0) {
sprintf(&(out[outIndex]), "%d", 0);
outIndex++;
}
out[outIndex] = '\0';
}
在调试模式下:程序运行到主功能结束并显示消息:
运行时检查失败2-变量“z”周围的堆栈已损坏
最大值总是8。z有8个字节的内存。不是吗?
怎么了?
谢谢!
最佳答案
在这里,您似乎占据了字节的上半部分和下半部分。
Digit[0] = (digits[i] & HIGH) / 16;
Digit[1] = digits[i] & LOW;
这些是十六进制数字:范围从0到15。
这意味着,如果最后一个数字大于9,带有
sprintf
的%d
将打印3个字符(2位和\0
),并且会出现缓冲区溢出。关于c++ - 运行时检查失败#2-变量“z”周围的堆栈已损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22711805/