关于sprintf_s与sscanf_s的问题?
问题1:
- C/C++ code
char* p = new char[6]; p = "00000"; sprintf_s( p, 6, "%05d", 100); delete []p;
这段代码,先给p 赋值以后 再用sprintf_s就会出现内存访问错误?这个怎么解释?
问题2:
- C/C++ code
char* Date = "20120926"; unsigned char ucTemp(0); sscanf_s( (char*)Date, "%2的", &ucTemp);
这段代码,执行的时候不会出现问题,但是在程序结束的时候,就会出现堆栈问题. 我估计是因为我用%d的格式化成int型,但是放进一个UCHAR类型的变量, 在最后程序结束的时候释放变量ucTemp的时候出现堆栈问题!不知道这样的解释对不对! 但是当我把ucTemp作为一个全局变量的时候就不会出问题? 这样是不是我的解释就有问题!
[解决办法]
首先 p = "00000"; 就不对。
p是地址。 你不能这样赋值。
应该这样吧
p[0] =
p[1] =
....
[解决办法]
[解决办法]
unsigned char就一个字节的空间,%d期待一个int,起码要4个字节的空间,明显越界了。
只要是越界,就是不好的;所谓声明成全局变量,不过是内存的位置不一样罢了,不过还是越界。
s系列的安全函数,不是所有的越界都可能检查出来的,比如全局变量所在的内存,也许就不会设置内存的边界检查区域,所以不一定能检查报错。
可以先用debugger跟踪一下,理解下所谓的越界是怎么一回事,然后查查s系列函数的一些原理,它是怎么检测越界的。