• [原]一个由memset引发的知识点


    [原]一个由memset引发的知识点

    在调试一个基数排序的问题时,我想对最开始分配的int*赋初值,类似于Windows上的ZeroMemory,但是我发现事情没有那么简单。
     
    例子:
    #include <iostream>
    #include <cstring>
    using namespace std;
     
    int main()
    {
       int* c = new int[10];
       memset(c, 0x0, 10);
     
       for(int i = 0; i < 10; i++)
           cout << c[i] <<" -> ";
       cout << "\n";
     
       return 0;
    }
    Output:
    0 -> 0 -> 1193541632 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
     
    1.
    memset(c, 0x0, 10); => memset(c, 0x0, 10 * sizeof(int));
    Output:
    0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 ->
     
    2.
    memset(c, 0x0, 10); => memset(c, 0x1, 10);
    Output:
    16843009 -> 16843009 -> 1193541889 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
     
     
    3.
    memset(c, 0x0, 10); => memset(c, 0x1, 10 * sizeof(int));;
    Output:
    16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 ->
     
     
    memset prototype:
    _CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
     
    memset(a,1,20);
    就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。
     
    另一篇文章讲的也比较好:
     
    memset的正规用法是只能用来初始化char类型的数组的,也就是说,它只接受0x00-0xFF的赋值
    然而,在大多数情况下,需要对一个double或int的数组赋一个相对很大或很小的初值
     
    以下的赋值方式是不正确的:
     
    memset(arr,2147483647,sizeof(arr));
     
    但是可以用一些技巧,来得到一个差不多的最大值,比如像:
     
    memset(arr,0x7F,sizeof(arr));
     
    它将arr中的值全部赋为2139062143
    (注:这里的意思是,会对int的arr[0]赋值为0x7f7f7f7f = 2139062143,大家不妨可试试)
    这是用memset对int赋值所能达到的最大值
     
    类似的还有:
     
    memset(arr,0x80,sizeof(arr)); //set int to -2139062144
    memset(arr,0x7F,sizeof(arr)); //set double to 1.38242e+306
    memset(arr,0xFE,sizeof(arr)); //set double to -5.31401e+303
  • 相关阅读:
    【angularJS】启动(bootstrap)机制
    【angularJS】定义模块angular.module
    【angularJS】简介
    .NET AutoMapper学习记录
    WebAPI学习
    【MongoDB】在C#中使用
    RabbitMQ介绍及windows下安装使用
    【MongoDB】初识
    php命名空间(nameSpace)的使用详解
    魔术方法
  • 原文地址:https://www.cnblogs.com/SunWentao/p/1759061.html
Copyright © 2020-2023  润新知