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

来源:互联网 发布:microsoft fix it官网 编辑:程序博客网 时间:2024/05/21 12:46

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

}

 

魔鬼常常在细节中。

原创粉丝点击