深入学习C语言中memset()函数的用法
头文件: #include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr,int value,size_t num ); 参数说明: 【函数说明】memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value,然后返回指向 ptr 的指针。 memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。例如: char str[20]; memset(str,' ',sizeof(str)-1); 【返回值】返回指向 ptr 的指针。 注意:参数 value 虽声明为 int,但必须是 unsigned char,所以范围在0 到255 之间。 范例: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 不可以声明为 char *str = "http://c.biancheng.net"; char str[] = "http://c.biancheng.net"; memset(str,'-',7); puts(str); system("pause"); return EXIT_SUCCESS; } 执行结果: -------c.biancheng.net 优化:尽量用memset将一个数组设置清零(带虚类除外),而不是通过for循环逐个置0 _asm { mov edi,f; // edi指向数组地的目标内存的起始处 mov ecx,1000/4; // 循环次数或移动次数 mov eax,0; // 每一次移动32位数,都置0 rep stosd; // 移动数据 } class CMemsetVirtualTest // 测试 带虚类,被memset为0后,虚表是否失效 { public: CMemsetVirtualTest() { memset(this,sizeof(CMemsetVirtualTest)); } virtual void NormalFun() { cout<<"test: NormalFun() 虚表指针有效"<<endl; } virtual ~CMemsetVirtualTest() { cout<<"test: ~CMemsetVirtualTest() 虚表指针有效"<<endl; } }; void testFun1() // 测试:栈上建立的对象 { CMemsetVirtualTest Ctest; Ctest.NormalFun(); } void testFun2() // 测试:堆上建立的对象 { CMemsetVirtualTest* Ptest = new CMemsetVirtualTest(); Ptest->NormalFun(); // 到这里一定会暴掉 delete Ptest; // 如果屏蔽上句,到这里也一定会暴掉 } int main() { CMemsetVirtualTest Ctest;// 测试:栈上建立的对象 Ctest.NormalFun();// 测试正常: CMemsetVirtualTest* Ptest = new CMemsetVirtualTest(); // 测试:堆上建立的对象 Ptest->NormalFun(); // 到这里一定会暴掉 delete Ptest; // 如果屏蔽上句,到这里也一定会暴掉 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |