C语言学习笔记:memset函数及其用法

    科技2025-12-25  7

    写这篇博客的目的一是相当于记笔记,二是提醒自己使用函数时首先要明白此函数的作用及声明,不要想当然的去使用,不然很可能会造成错误。

    定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。 而memset() 函数可以说是初始化内存的“万能函数”,我们通常拿他为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。 下面是 memset() 函数的声明。

    void *memset(void *str, int c, size_t n) str -- 指向要填充的内存块。 c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。 n -- 要被设置为该值的字符数。 返回值:该值返回一个指向存储区 str 的指针。

    使用memset函数的示例如下:

    #include <stdio.h> #include <stdlib.h> #include <string.h> int *a = NULL; int n = 0; int main() { scanf("%d", &n); //输入数组元素个数n a = (int *)malloc(sizeof(int) * n); //创建数组a[n] for (int i = 0; i < n; i++) //初始化,所有元素等于1 { a[i] = 1; } a_view(); //测试用循环进行的初始化 memset(a, 0, sizeof(int) * n); //使用memset初始化为0 a_view(); //测试用memset进行的初始化 free(a); return 0; } int a_view() { for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }

    运行结果:

    在使用过程中,因程序需要,我想将数组内所有元素变为2,那么,既然我能用memset初始化为0,我为什么不能将memset(a, 0, sizeof(int) * n)中0改为2从而达到将所有值都变为2的目的呢? 于是我便使用memset进行赋值,结果发现不行! 其运行结果如下图: 想知道原因就要回头再仔细看下memset的函数声明,其中: c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。 因为这个函数进行数据填充时是一个字节一个字节填充的,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。 将c设为-1,运行结果:

    当然若我们把他变为char类型数组,并把它初始化成指定字符,这是可以的:

    #include <stdio.h> #include <stdlib.h> #include <string.h> char *a = NULL; int n = 0; int main() { scanf("%d", &n); //输入n a = (char *)malloc(sizeof(char) * n); //创建数组a[n] for (int i = 0; i < n; i++) //初始化,所有元素等于1 { a[i] = 'a'; } prime_view(); memset(a, '2', sizeof(char) * n); //使用memset初始化为0 prime_view(); free(a); return 0; } int prime_view() { for (int i = 0; i < n; i++) { printf("%c ", a[i]); } printf("\n"); return 0; }

    运行结果:

    那么问题来了,为什么memset只需要一个字节的值来做填充,但却需要用户传入一个int? 嗯,这就要翻C语言的成长史了,大家可以看下面这个博客: https://www.cnblogs.com/foohack/p/3640386.html

    Processed: 0.017, SQL: 9