运行时检查失败 #2 - 变量 z" 周围的堆栈已损坏

Run-Time Check Failure #2 - Stack around the variable ''z" was corrupted

本文关键字:周围 堆栈 已损坏 变量 检查 失败 运行时      更新时间:2023-10-16

我有这样的代码:

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] = '';
}

在调试模式下:程序运行到main函数结束并显示信息:

运行时检查失败#2 -变量'z'周围的堆栈损坏

outIndex的最大值总是8。z有8字节的内存。不是吗?

有什么问题吗?

谢谢!

这里似乎取了字节的上半部分和下半部分。

Digit[0] = (digits[i] & HIGH) / 16;
Digit[1] = digits[i] & LOW;

这些是十六进制数字:它们的范围是0-15。

这意味着如果最后一位数字大于9,sprintf%d将打印3个字符(2位数字和),您将有缓冲区溢出

用%c代替%d

sprintf(&(out[outIndex]), "%d", Digit[j]);

运行良好吗?