数据结构基础之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
数据结构基础之memset---有memset 抛出的int 和 char 之间的转换和字节对齐的更多相关文章
- 《Java基础——异常的捕获与抛出》
Java基础--异常的捕获与抛出 ' 前言: Error类(错误)和Exception类(异常)是Throwable类的子类. 异常分为CheckedException类(编译时异常)和Ru ...
- Java基础(35):装箱与拆箱---Java 中基本类型和包装类之间的转换(Wrapper类)
基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了. 那什么是装箱 ...
- C++学习40 抛出自己的异常
throw 是C++中的关键字,用来抛出异常.如果不使用 throw 关键字,try 就什么也捕获不到:上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常. throw 既可以用在 ...
- java异常处理 throw RuntimeException时不需要同时方法中声明抛出throws 异常等待调用者catch进行捕获 子父类异常问题
package com.swift.exception1; public class Demo_Exception { public static void main(String[] args) { ...
- java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)
1.异常的体系 /* ------|Throwable:所有异常和错误的超类 ----------|Error(错误):错误一般用于jvm或者硬件引发的问题,所以我们一般不会通过代码去处理错误的 -- ...
- 为什么全世界都对HTTPS抛出了橄榄枝,HTTPS到底有什么好?HTTPS如何配置?
整个互联网世界,正从"裸奔"向HTTPS时代转型. 淘宝.天猫在2015年完成规模巨大的数据"迁徙",将百万计的页面从HTTP切换到HTTPS:苹果要求所有iO ...
- Python之数据结构基础
一.数据结构基础 a.什么是数据结构 b.数据结构的分类 c.列表 import random from timewrap import ...
- cocos2d-x 错误异常抛出捕获和崩溃拦截
Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...
- [Go] 如何正确地 抛出 错误 和 异常(error/panic/recover)?
序言 错误 和 异常 是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从表面上看,一切皆错误的思路 ...
随机推荐
- 【Eclipse】Eclipse中tomcat的Server配置(解决修改代码不断的重启服务器)以及设置tomcat文件发布位置与JSP编译位置查看
Eclipse有时候修改一点JS或者JSP都会自动重启,有时候修改完JS或者JSP之后必须重启服务器才生效,下面研究了server的一些选项之后彻底解决了这些问题,下面做记录: 我的 Eclipse ...
- 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array
传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5, ...
- 安装phpssdb扩展:
安装 igbinary 扩展(安装phpssdb扩展时候要用到--enable-ssdb-igbinary): clone https://github.com/igbinary/igbinar ...
- Scrapy学习-13-使用DownloaderMiddleware设置IP代理池及IP变换
设置IP代理池及IP变换方案 方案一: 使用国内免费的IP代理 http://www.xicidaili.com # 创建一个tools文件夹,新建一个py文件,用于获取代理IP和PORT from ...
- GridControl CardView ShowCardExpandButton or GridCardExpandButton
关于DevExpress.XtraGrid.v13.1.dll和DevExpress.XtraGrid.v12.2.dll中ShowCardExpandButton 或者 GridCardExpan ...
- HTTP PUT方法和POST方法的区别
这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别 ...
- AC日记——图灵机游戏 codevs 2292
2292 图灵机游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description [Shadow 1]第二题 ...
- js-classList修改class属性
classList定义与用法 1)classList属性返回元素的类名,作为DOMTokenList对象 2)该属性用于在元素中添加,移除及切换css类 3)classList属性是只读的,但可以用a ...
- (5)DataSet
DataTable赋值给DataSet DataSet ds = new DataSet(); DataTable dt1 = new DataTable(); DataTable dt2 = new ...
- Manajro17配置
:Manjaro近来点击率一直排行第一,比较适合笔记本使用,这次从下载刻录开始讲述: 1: 下载刻录 因为一些环境特殊原因,官网下载还是比较慢的,普通用户还是从清华镜像源下载比较快,当然你也可以选择官 ...