我有这个密码:

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/

10-11 23:12