数据结构基础之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)?
序言 错误 和 异常 是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从表面上看,一切皆错误的思路 ...
随机推荐
- java面试题之数据基本类型各占几个字节
类型 位数 字节数 short 2*8 2 char 2*8 2 int 4*8 4 float 4*8 4 long 8*8 8 double 8*8 8
- linux JDK安装(一)
1.先卸载服务器自带的jdk软件包# java -version #查看服务器是否安装过jdkjava version "1.6.0_17"OpenJDK Runtime Envi ...
- poj 6243 Dogs and Cages
Dogs and Cages Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- LOJ#2304. 「NOI2017」泳池
$n \leq 1e9$底边长的泳池,好懒啊泥萌自己看题吧,$k \leq 1000$.答案对998244353取膜. 现在令$P$为安全,$Q$为危险的概率.刚好$K$是极其不好算的,于是来算$\l ...
- scroll与按钮的位置
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习javascript设计模式之代理模式
1.代理模式为一个对象提供一个代用品或占位符,以便控制对它的访问. 2.不用代理模式: 客户 -> 本体 使用代理模式: 客户 -> 代理 -> 本体 3.例子场景1 点击操作与 ...
- vue.js源码学习分享(一)
今天看了vue.js源码 发现非常不错,想一边看一遍写博客和大家分享 /** * Convert a value to a string that is actually rendered. *转换 ...
- 转:c++ Oracle OCCI 编程
原地址http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 找不到具体的出处,只好不写了. OCCI数据库ORACLE编程步骤1. 配置环境(1) ...
- 洛谷——P1238 走迷宫
P1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数 ...
- OAuth 2.0 in Web API #Reprinted
http://www.codebetter.com/howarddierking/2011/10/11/oauth-2-0-in-web-api/