C语言memset函数详解

目录
  • 一、memset函数原型:
  • 二、使用memset函数
  • 三、给int类型赋值为1
  • 四、扒开内存
  • 五、memset给变量赋值
  • 总结

在c语言中,使用变量前,需要先对变量的值进行初始化。数组在内存中占用一片连续的存储块。而c语言提供了memset函数(头文件string.h)对数组进行组团赋值。(memset函数也能对变量赋值,但只有无聊的人才会这么做。详见下文目录五)

一、memset函数原型:

void memset ( void *s , char ch, unsigned n )

函数功能:将s为首地址的一片连续的n个字节内存单元都赋值为ch

二、使用memset函数

# include <stdio.h>
# include <string.h>
int main() {
    char c[10];
    // 把数组c的10个元素都赋值为'a'
    memset(c, 'a', 10);
    for (int i=0; i<10; i++) {
        printf("%c\t", c[i]);
    }
    return 0;
}

输出:
a a a a a a a a a a

# include <stdio.h>
# include <string.h>
int main()
{
    int a[10];
    memset(a, 0, 10*sizeof(int));
    /* 数组a是int类型的,一个int占4个字节,所以a[10]实际上有40个字节。
       而char类型只占1个字节,所以不需要乘sizeof(char) */
    // 输出数组a和b
    for (int i=0; i<10; i++) {
        printf("%d\t", a[i]);
    }
    printf("\n");
    return 0;
}

输出:
0 0 0 0 0 0 0 0 0 0

emset函数是对n个字节进行赋值。而char类型占1个字节。但是int类型占4个字节,所以对int、short等类型赋值时,需要乘上字节数。

三、给int类型赋值为1

# include <stdio.h>
# include <string.h>
int main()
{
    int a[10];
    memset(a, 1, 10*sizeof(int));
    // 输出数组a
    for (int i=0; i<10; i++) {
        printf("%d\t", a[i]);
    }
    return 0;
}

输出:
16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009

输出结果可以看到,并没有给数组元素赋值为1。为什么呢?这是为什么呢?

前面我们说过,memset是对连续的n个字节进行赋值。但是int类型占4个字节。memset赋值时,直接将数组拆成40个字节赋值,并没有把4个字节看成一个整体

四、扒开内存

我们定义一个数组;
int a[2];
memset(a, 1, 2*sizeof(int));
假设内存中每个位都是0,定义数组,以a为首地址的内存各个位:
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
使用memset函数,对每个字节赋值为1。一个字节为8位,所以,数组变为
0000 0001 0000 0001 0000 0001 0000 0001
0000 0001 0000 0001 0000 0001 0000 0001
注意,赋值数组时,一个int被拆成了4个单独的字节
而0000 0001 0000 0001 0000 0001 0000 0001的10进制刚好为
16,843,009

五、memset给变量赋值

memset函数第一个参数是指针类型,也就是说,只要我们给他一个地址就行了

# include <stdio.h>
# include <string.h>
int main()
{
    char a;
    memset(&a, 'c', 1);
    printf("%c\n", a);
    return 0;
}

输出:
c

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解C语言中的memset()函数

    C语言memset()函数:将内存的前n个字节设置为特定的值 头文件: #include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ); 参数说明: ptr 为要操作的内存的指针. value 为要设置的值.你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换.

  • C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s, int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三.常见错误 1.搞反了 ch 和 n的位置 对char[20]清零,一定是 memset(a,0,20); 2.过度使用memset 3.其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现 int fun(strucy someth

  • 深入学习C语言中memset()函数的用法

    头文件: #include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ); 参数说明: ptr 为要操作的内存的指针. value 为要设置的值.你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换. num 为 ptr 的前 num 个字节,size_t 就是

  • C语言memset函数详解

    目录 一.memset函数原型: 二.使用memset函数 三.给int类型赋值为1 四.扒开内存 五.memset给变量赋值 总结 在c语言中,使用变量前,需要先对变量的值进行初始化.数组在内存中占用一片连续的存储块.而c语言提供了memset函数(头文件string.h)对数组进行组团赋值.(memset函数也能对变量赋值,但只有无聊的人才会这么做.详见下文目录五) 一.memset函数原型: void memset ( void *s , char ch, unsigned n ) 函数功

  • C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, size_t n); 这里s可以是数组名,也可以是指向某一内在空间的指针: v为要填充的值: n为要填充的字节数: 例子: struct data { char num[100]; char name[100]; int n; }; struct data a, b[10]; me

  • C语言lseek()函数详解

     头文件: #include <sys/types.h> #include <unistd.h> 函数原型: off_t lseek(int fd, off_t offset, int whence);//打开一个文件的下一次读写的开始位置 参数: fd 表示要操作的文件描述符 offset是相对于whence(基准)的偏移量 whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END为文件指针尾 返回值: 文件读写指针距文件开头

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • Go语言init函数详解

    Go init函数详解 init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高.init 函数通常被用来: 对变量进行初始化 检查/修复程序的状态 注册 运行一次计算 包的初始化 为了使用导入的包,首先必须将其初始化.初始化总是以单线程执行,并且按照包的依赖关系顺序执行.这通过Golang的运行时系统控制,如下图所示: 初始化导入的包(递归导入) 对包块中声明的变量进行计算和分配初始值 执行包中的init函数 initial.go package main import

  • c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的 如果分配成功:则返回指向被分配内存空间的指针 不

  • C语言fillpoly函数详解

    C语言中,fillpoly函数的功能是画一个多边形,今天我们就来学习学习. C语言fillpoly函数:填充一个多边形 函数名:fillpoly 功  能:画并填充一个多边形 头文件:#include <graphics.h> 原  型:fillpoly(int numpoints, int far *polypoints); 参数说明:numpoints 为多边形的边数:far *polypoints 为存储各顶点坐标的数组,每两个一组表示一个顶点的 X 和 Y 坐标. 实例代码: #inc

  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

  • R语言学习笔记之lm函数详解

    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: ------------------------------------------------------------- ------------------------------------------------------------- 结果可以发现,两者的结果是一样的,并无区别,但是若改为lm(y~x-1)就能看出+1和

随机推荐