需求是这样:要将一个unsigned char数组的ascii值按照小尾顺序转换成一个int.
比如说: unsigned char array[]={0x01,0xab,0x33,0x05}
转换出来的int型数就是: 0x0533ab01 = 87272193
对于32位机来说,int的长度是4,所以array最多只能是4维数组。如果是64位机就可以去到8维。
编程实现如下:
void fn() {
int theInt = 0;
sscanf((const char*)(array), "%s", &theInt );
}
debug过程中, theInt 可以被正确赋值。但是在函数结束符 } 处,发生了一个stack overflow 栈溢出错误。
想了一下,问题在这里:
sscanf接受的 convert format string是"%s",也就是按字符串方式输出。大家都知道C++中字符串的长度是N+1,最后一位以NULL结尾。所以sscanf影响的,是 theInt 和 theInt 后面1位的内存区域,这就是堆栈错误的根源。
改成这样,BUG消失:
void fn() {
int theInts[2] = {0};
sscanf((const char*)(array), "%s", theInts );
}
魔鬼常常在细节中。