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

摘要:
我们先从数据储存分析memset函数作用:在一段内存中填充某个给定的值,注意填充时是按照字节顺序填充的,而不是按照元素填充。

今天晚上,在做滤波算法时,里面用到很多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 ",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 ",tmpValue);
usleep(200);
}
printf("test: ");
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/6973469int 和 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

免责声明:文章转载自《数据结构基础之memset---有memset 抛出的int 和 char 之间的转换和字节对齐》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HCNA修改OSPF基准带宽Java 简单的excel读写操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Loadrunner中进行md5加密

    1.打印时间戳 web_save_timestamp_param("tStamp",LAST);//打印时间戳 lr_output_message("#打印时间:%s",lr_eval_string("{tStamp}"));//把时间戳转换字符串 2.md5加密(下载) 方法一:加入md5.h文件到项目中,需要注意Action中用到的变量必须在g...

[MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper 这个数据库是安装...

pgsql 远程机器无法连接数据库报错处理方法

因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本地localhost访问正常,在相同网段的远程机器访问报如下错误 “server closed the connection unexpectedly. This probably means the server terminated abnormally before or while pr...

前端 vue表格数据导出Excel 文件实现

实现思路 使用json2csv将后台json数据转化为csv格式数据 采用创建Blob(二进制大对象)的方式来存放缓存数据;生成下载链接; 创建一个a标签,设置href和download属性 触发a标签的点击事件实现下载 实现如下: 表格为 <Table :columns="columns" :data="listdata"></Ta...

微信小程序 云开发数据库查询为空的原因

1、权限设置。 2、数据类型不一致 这种场景不多见。一般是从一个表里取出一个数据,用它去查另外一个数据表。 eg. 我从A表里查出一个数据a,用a去匹配B表里_id查询最终需要的数据。 (顺便一提,提取某条记录的某个数据的代码:res.data[0].a) 但是A表的a是number类型,B表里的_id是string类型。所以表达式写的再正确,数据类型不...

微信小程序单向数据流解决

1. 小程序中没有vue中v-model一样的双向数据机制,并且小程序也不像vue那样的进行 实时的数据驱动视图. 小程序页面数据加载完成后再去改变data中的数据页面是 不会有变化的. 2. 解决: 使用小程序提供的特定方法, 该方法会触发框架本身再次对页面进行渲染 this.setDate()方法的使用如下:...