我有这样的代码:
char z9;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;无符号字符digits4;无符号char Digit2;memcpy((void*)位数,(void*)&val,4);for (i = 0;i <= 3;i++) {位数=(数字化与高)/ 16;Digit1 =数字与低;对于(j = 0;j< 2;j++) { sprintf(&(outoutIndex),"%d",Digitj);outIndex++;}}如果(outIndex == 0) { sprintf(&( outoutIndex ),"%d",0);outIndex++;}outoutIndex= '\0';}
在调试模式下:程序运行到主函数的末尾,并显示消息:
运行时检查失败#2 -变量'z‘周围的堆栈已损坏。
outIndex的最大值总是8。Z有8个字节的内存。不是吗?
有什么问题吗?
谢谢!
发布于 2014-03-28 11:52:47
在这里,您似乎取了字节的上、下半部分。
Digit[0] = (digits[i] & HIGH) / 16;
Digit[1] = digits[i] & LOW;这些是十六进制数字:从0到15不等。
这意味着,如果最后一个数字大于9,sprintf和%d将打印3个字符(2位数和\0),并且会出现缓冲区溢出。
发布于 2014-03-28 11:41:45
中使用%c而不是%d
sprintf(&(out[outIndex]), "%d", Digit[j]);工作顺利吗?
https://stackoverflow.com/questions/22711805
复制相似问题