zoukankan      html  css  js  c++  java
  • memset的一些坑

    memset是一个C标准库函数,在string.h中

    void *memset(void *s, int ch, size_t n);

    函数解释:将s中当前位置后面的n个字节用 ch 替换 ,返回s。

    坑点:

    替换时是按照单个字节赋值的。

    也就是说每个字节是用取出ch的低字节,进行赋值。

    对于int数组,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111)。

    所以一般只用0和-1作为ch,不用其他值。

    对于char数组,也是同理。

    实验1:

    int main(int argc, char *argv[])
    {
    int a[10];
    memset(a, 2, sizeof(a));
    int i;
    for (i = 0; i< sizeof(a)/sizeof(a[0]); i++)
    printf("%d ", a[i]);
    return 0;
    }

    发现a[i]的值都是33,686,018。

    而33,686,018的二进制正是0000 0010 0000 0010 0000 0010 0000 0010.也就是4个0000 0010(也就是十进制的2)拼接起来。

    实验2:

    int main(int argc, char *argv[])
    {
    char a[10];
    memset(a, '2', sizeof(a));
    int i;
    for (i = 0; i< sizeof(a)/sizeof(a[0]); i++)
    printf("%c ", a[i]);
    return 0;
    }

    输出一堆2

  • 相关阅读:
    JS 知识点补充
    JS 数据之间类型的转化
    JS 数据的类型
    数据结构--数组、单链表和双链表介绍 以及 双向链表
    数据结构--队列
    数据结构--栈
    24. 两两交换链表中的节点
    23. 合并K个排序链表
    22. 括号生成
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/gagaein/p/13934004.html
Copyright © 2011-2022 走看看