目录
说明
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。