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

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

定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。
而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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值