C语言memset()函数详解

目录

说明

函数原型

参数

返回值

功能和用法

对数组进行清零

对结构体进行初始化

设置特定的值


说明

memset() 是一个 C 语言中的库函数,用于将指定的内存块设置为指定的值。要在 C 代码中使用 memset() 函数,你需要包含 <string.h><cstring> 头文件。

它通常用于对数组、结构体或其它内存块进行初始化或清零操作。下面是 memset() 函数的详细说明:

函数原型

void *memset(void *ptr, int value, size_t num);

参数

  • ptr:指向要设置值的内存块的指针。
  • value:要设置的值。value 和 ptr 指向的内存块的类型应兼容。一般情况下,可以使用整数或字符值作为 value
  • num:要设置的字节数(或元素个数)。通常使用 sizeof() 运算符来确定要设置的字节数或元素个数。

对于第三个参数,使用 sizeof 时需要注意数组类型与堆内存类型

堆内存如:

char*p=(char*)malloc(sizeof(char)*16);
    for(int i=0;i<15;i++)
    {
        p[i]=48+i;
    }
    memset(p,0,sizeof(p));    
    memset(p,0,sizeof(char)*15);

 两个memset的效果不同。对于代码 char *p = (char *)malloc(sizeof(char) * 16);p 是一个指向分配了16个字节内存的字符数组的指针。

  • memset(p, 0, sizeof(p)); 实际上将 p 这个指针变量的内存块(通常是4或8个字节)设置为0,而不是将 p 指向的内存块内容设置为0。

  • memset(p, 0, sizeof(char) * 15);p 指向的内存块的前15个字节设置为0,因为 sizeof(char) * 15 计算的是 p 指向的内存块的总大小。

所以,如果你想要将 p 指向的内存块的内容设置为0,应该使用第二种方式来调用 memset() 函数,即 memset(p, 0, sizeof(char) * 15);

数组如:

char s[20]="okm789654023654566";
memset(s,0,sizeof(s));
memset(s,0,sizeof(char)*18);

对于 char s[20] = "okm789654023654566"; 这个字符串数组,两个 memset() 函数的效果是一样的。因为在这种情况下, sizeof(s)sizeof(char) * 18 的结果都是 20(数组的大小),它们都会将整个数组的内容设置为0。

所以无论是使用 memset(s, 0, sizeof(s)); 还是 memset(s, 0, sizeof(char) * 18); 都能正确地将 s 数组的所有元素设置为0。

返回值

memset() 函数返回一个指向 ptr 的指针。

用途

memset() 函数的主要功能是将指定的内存块的每个字节设置为给定的值。

以下是一些常见的用法示例:

对数组进行清零

int myArray[10]; 
memset(myArray, 0, sizeof(myArray));

这个示例演示了如何使用 memset() 函数将一个整型数组 myArray 的所有元素设置为 0。我们使用 sizeof() 运算符来确定数组的大小,然后将其作为 num 参数传递给 memset() 函数。

对结构体进行初始化

typedef struct 
{ 
    int id; 
    char name[20]; 
    float salary; 
} Employee; 
Employee emp; 
memset(&emp, 0, sizeof(Employee));

这个示例展示了如何使用 memset() 函数将结构体 Employee 的所有成员设置为 0。我们使用 sizeof() 运算符确定结构体的大小,并将其作为 num 参数传递给 memset() 函数。需要注意的是,我们传递的是结构体变量的地址(&emp)作为 ptr 参数。

设置特定的值

char buffer[100]; 
memset(buffer, 'A', sizeof(buffer));

这个示例展示了如何使用 memset() 函数将一个字符数组 buffer 的所有元素设置为字符 'A'。我们使用 sizeof() 运算符确定数组的大小,并将其作为 num 参数传递给 memset() 函数。

总的来说,memset() 函数提供了一种快速和方便的方式来对内存块进行初始化或清零操作。通过指定要设置的值,可以灵活地将其应用于不同类型的数据结构和内存块。但需要注意的是,使用 memset() 函数时要保证操作的内存块有效并且足够大,以避免访问非法内存区域或导致缓冲区溢出等问题。

需要注意的是,由于 memset() 函数是按字节进行复制的,所以当将一个整数值作为 value 传递时,每个字节都将被设置为该值的低字节。这可能会导致在某些情况下得到意想不到的结果。如果要给整型数组赋值,建议使用循环遍历数组并逐个为数组元素赋值的方式,以确保每个数组元素都被正确设置。

以下是一个示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    int array[5];
    int value = 10;
    
    memset(array, value, sizeof(array));

    for (int i = 0; i < 5; i++) {
        printf("%d ", array[i]);
    }
  
    return 0;
}

上述代码中,我们想使用 memset() 函数将整型数组 array 的所有元素设置为 10。

但输出结果为:

168430090 168430090 168430090 168430090 168430090

memset()函数可以给整型数组统一赋值为 0 或 -1。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值