数据结构基础之memset---有memset 抛出的int 和 char 之间的转换和字节对齐

  今天晚上,在做滤波算法时,里面用到很多float 和int 以及char 之间的类型强制转换,后面滤波完发现图片有些区域块,有过度曝光的白光,我就跟踪,以为是char 字符数字数据溢出问题,加了0-255的判断,然后打印,发现强制转换后的int类型数据多处出现负数,很奇怪,后面写了个测试程序,慢慢的问题出来了 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int test(int wid, int hei, int *buffer)
{
int i,j;
int tmpVal;
int *pbuffer = buffer;
//memset(pbuffer,0,wid*hei*sizeof(buffer));
for(i =0; i<wid*hei; i+=4)
{
tmpVal =(int)*(pbuffer+i);
printf("%d\n",tmpVal);
usleep(200);
}
return 0;
}
int main()
{
int wid,hei,frameSize;
int i,j;
unsigned char tmpValue =0;
wid =4;
hei =5;
frameSize =wid*hei*sizeof(int);

int *buffer =(int*)malloc(wid*hei*sizeof(int));
memset(buffer,2,wid*hei*sizeof(int));
for(i =0; i<wid*hei; i++)
{
tmpValue = *(buffer +i);
printf("%d\n",tmpValue);
usleep(200);
}
printf("test:\n");
test(wid,hei,buffer);
return 0;
}

输出结果很明显:

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
test:
33686018
33686018
33686018
33686018
33686018

主函数里面用char 类型的临时变量tmpvalue 没变,是2,然而, 子函数 test中用int类型的数据缺出现了33686018,这个数字是怎么来的呢?

我们先从数据储存分析memset函数

作用:在一段内存中填充某个给定的值,注意填充时是按照字节顺序填充的,而不是按照元素填充。
此方法是对较大的结构体和数组进行清零操作的一种有效方法。
函数形式:memset(void *buffer,int c,size_t n)
buffer是需要设置的内存的开始地址;c是期望填充值;n是需要填充的字节数。

  所以这里的主函数把buffer【i】 的填充四个字节0x02 0x02 0x02  0x02的存储高第一个 字节赋值哥char 类型的 tmpvalue 0x02

  如果这里的2 改为257 情况如下:

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
test:
16843009
16843009
16843009
16843009
16843009

同理257  = 0x1 01(hex) ,然后0x01010101(hex)= 16843009(inter),自然char 去高位一个字节0x01 =  1,一般memset 对字符串进行操作 ,● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

http://www.360doc.com/content/11/0120/19/1317564_87917268.shtml

http://blog.csdn.net/lida2003/article/details/6973469 int 和 char 转换后的差异

http://baike.baidu.com/view/3975627.htm

http://www.gfsoso.com/?q=+int+%E5%92%8Cchar+%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2%E7%9A%84%E9%97%AE%E9%A2%98

上一篇:Vitamio与FFmpeg、LGPL、GPL的关系


下一篇:【转】char*,string,CString,int,char[]之间的转换