sscanf 函数遇到的一个小问题及其解决方法

需求是这样:要将一个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 );

}

 

魔鬼常常在细节中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值