小心别踩到了memset的坑
memset
标签(空格分隔): 未分类
详解memset用法,不要掉坑里了
原型:void * memset ( void * ptr, int value, size_t num );
memset主要应用场景:
-
对某个一维(二维)数组或结构体进行清0处理
-
将某一个字符赋值给字符数组(注意不能够赋值一个int类型甚至double类型数字:因为memset函数本身就是按char类型字节大小进行赋值)
-
实现一维(二维)bool数组的置false和置true
char a[10]; // 清0一个字符数组 memset(a, 0, sizeof(a)); // 0——strlen是计算第一个'\0'之间的字符数 cout << strlen(a) << endl; memset(a, '1', sizeof(a)); // 输出10个1 for (int i = 0; i < strlen(a); i++) cout << a[i] << " "; int a[10]; // 清0一个int数组 memset(a, 0, sizeof(a)); // 输出10个0 for (int i = 0; i < sizeof(a)/sizeof(int); i++) cout << a[i] << " "; // 无效做法 int a[10]; memset(a, 1, sizeof(a)); // 输出10个16843009 for (int i = 0; i < sizeof(a)/sizeof(int); i++) cout << a[i] << " "; bool a[10]; // a里面的值都是false memset(a, 0, sizeof(a)); // a里面的值都是true——原因很简单,bool类型除了几个特殊的代表false的元素(NULL, 0, ...)之外都是true memset(a, 1, sizeof(a)); // 清空一个结构体里面的数据内容 struct student { int num; int otherNum; char myStr; }; student myStu[10]; // 清空一个具体的某个结构体 memset(&mystu[0], 0, sizeof(struct student)); for (int i = 0; i < 10; i++) { myStu[i].num = 1000; myStu[i].otherNum = 1000; myStu[i].myStr = '9'; } // 清空一个结构体数组所有数据内容 memset(myStu, 0, sizeof(myStu));一个常犯的错误
bool* a = new bool[100]; memset(a, 0, sizeof(a)); // 由于这里a不是一个数组,而仅仅是一个指针,所以sizeof(a)的大小仅仅是8(假设在64位操作系统中)实现清零的其他简便操作
// 置零int,char,bool一维数组均可 int a[10] = {}; bool a[10] = {}; char a[10] = {};
没有演示二维数组的情况,但是和一维数组的清零操作基本一样
以上纯属个人理解,难免会有错误,如果有错,请各位大神指点~

浙公网安备 33010602011771号