C++ memset()函数和bzero()函数

  • Post author:
  • Post category:其他





1、memset函数说明


memset()的函数,

它可以一字节一字节地把整个数组设置为一个指定的值

。它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。

#include <string.h>
// 将s中的前n个字节用ch替换并且返回s,
void *memset(void *s,int ch,size_t n)




(1)清空数组和初始化

memset(buffer, 0, sizeof(buffer)) // 这个函数在socket很常用。
char a[100];
memset(a, '/0', sizeof(a));  // 初始化数组。




(2)清空一个结构体

// 在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
struct sample_struct
{
	char csName[16];
	int iSeq;
	int iType;
};
memset(&stTest, 0, sizeof(struct sample_struct));

// 如果是数组:
struct sample_struct TEST[10];
memset(TEST, 0, sizeof(struct sample_struct)*10);




2、类对象使用memset应注意的问题


memset某个结构(或其它的数据类型)在C语言中是很常见的代码,其目的是对结构(或其它的数据类型)进行初始化,通常都是将变量置为NULL或者0。在C++中,针对类对象除了用构造函数初始化对象外,也可以使用memset来进行初始化操作(确实有这种情况,不得已而为之,请大家不要把鸡蛋砸过来!)。但是一定要注意以下所说的这种情况:


如果类包含虚函数,则不能用 memset 来初始化类对象。



因为每个包含虚函数的类对象都有一个指针指向

虚函数表(V-Table)

,这个指针被用于解决

运行时以及动态类型强制转换时虚函数的调用问题

。当进行memset操作时,

虚函数表里的指针置NULL

,这样一来,只要调用虚函数,程序便崩溃。




3、bzero()函数简介

#include <string.h>
// bzero() 会将内存块(字符串)的前n个字节清零;
// s为内存(字符串)指针,n 为需要清零的字节数。
// 在网络编程中会经常用到。
void bzero(void *s, int n);



版权声明:本文为daaikuaichuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。