• 数据结构基础之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 ",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/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

  • 相关阅读:
    MySQL改变表的存储引擎
    数字三角形合集
    POJ 3250 Bad Hair Day 单调栈
    Linux 网卡驱动学习(二)(网络驱动接口小结)
    Lecture Notes: Macros
    [转]LNMP环境下的Web常见问题排查(精品)
    ssh-copy-id password
    python
    python
    Ceph
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/4127570.html
Copyright © 2020-2023  润新知