c语言memset函数用法,深入学习C语言中memset()函数的用法
头文件:
#include
memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:
void * memset( void * ptr, int value, size_t num );
参数说明:
ptr 为要操作的内存的指针。
value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。
num 为 ptr 的前 num 个字节,size_t 就是unsigned int。
【函数说明】memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value,然后返回指向 ptr 的指针。
memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。例如:
char str[20];
memset(str, '\0', sizeof(str)-1);
【返回值】返回指向 ptr 的指针。
注意:参数 value 虽声明为 int,但必须是 unsigned char,所以范围在0 到255 之间。
范例:
#include
#include
#include
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
下面这个例子,大家可以参考:3D游戏编程大师技巧。本文其实重点是memset,原因是在工作中,用的比较多。
例如:要清空一个float f[10000],应该用memset(f,0,sizeof(float) * 10000);
而不是: for(int i=0; i<10000; ++i) f[i] = 0;
当然,还可以用内嵌汇编的形式:
_asm
{
mov edi, f; // edi指向数组地的目标内存的起始处
mov ecx, 1000/4; // 循环次数或移动次数
mov eax, 0; // 每一次移动32位数,都置0
rep stosd; // 移动数据
}
哈,这个准则有个前提,那就是带虚的类除外,原因是,memset将类清空,有可能将虚表也给置0了。
有可能是因为:类的创建分:栈上和堆上。
如果在栈上,那么栈对象的虚函数调用可能会在静态时确定,从而绕过虚表。所以不会出错。
但堆上就一定会出错,下面给出测试代码:
class CMemsetVirtualTest // 测试 带虚类,被memset为0后,虚表是否失效
{
public:
CMemsetVirtualTest()
{
memset(this,0,sizeof(CMemsetVirtualTest));
}
virtual void NormalFun()
{
cout<
}
virtual ~CMemsetVirtualTest()
{
cout<
}
};
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; // 如果屏蔽上句,到这里也一定会暴掉
}
即:
在C++中,涉及虚技术的类,他的对象内存区块中就不单纯是用户定义这个类时看上去的那些数据结构,编译器会在当中安插一些数据或代码,用来实现响应的虚技术.于是当你用memset函数时会把这些编译器安插的东西冲掉, 程序执行结果变得未知. 这时候如果拷贝对象C++会使用memberwise拷贝, 此时编译器既拷贝用户定义的数据结构,还会对支持虚技术的相关设施进行适当的修改.
如果对象没有用到虚技术, 那么就可以使用memset,就跟正常情况一样,可以逐位拷贝.
c语言memset函数用法,深入学习C语言中memset()函数的用法相关推荐
- c语言中fputc函数的作用是,C语言中fputc函数的用法
C语言中fputc函数的用法 C语言中fputc函数的用法为"int fgetc (FILE *fp)",该函数的作用是从指定的文件中读取一个字符, 读取成功时会返回读取到的字符, ...
- c语言中fputc函数的作用是,C语言中fputc函数的用法_后端开发
Python画ROC曲线和AUC值计算(附代码)_后端开发 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器的优劣.这篇文章将先简单的 ...
- c语言中sizeof函数的作用是,c语言中sizeof函数的用法
C语言sizeof函数如何使用? 怎样利用sizeofCSS布局HTML小编今天和大家分享各种数据类型占用的字节数? (1)sizeof不是函数,它只是一个操作符(operator). (2)size ...
- c语言中结构体类型只有,C语言中main()函数不要返回结构体类型(求助)
大家先看一下这段程序: #include typedef unsigned char bool; typedef struct _person person; struct _person { boo ...
- c语言fclose函数作用,详解C语言中freopen()函数和fclose()函数的用法
C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include 定义函数: FILE * freopen(const char * path,const char * mode ...
- c语言说明函数的作用是,C语言中rewind函数的作用是什么?
rewind函数的作用是:使文件位置指针重新返回文件的开始位置. C语言rewind函数 rewind函数是C语言程序中的库函数 功 能:将文件内部的位置指针重新指向一个流(数据流/文件)的开头 注意 ...
- c语言long的用法及作用,c语言中long long的用法
在分析BT代码的过程中,遇到了这样的定义:long long line_position;很是纳闷,在C语言中我还没有见过这样的写法,网上搜了,资料也很少,最后在C语言标准与实现这本书中找到了关于lo ...
- c语言程序功能作用是什么,C语言中rewind函数的作用是什么?
rewind函数的作用是:使文件位置指针重新返回文件的开始位置. C语言rewind函数 rewind函数是C语言程序中的库函数 功 能:将文件内部的位置指针重新指向一个流(数据流/文件)的开头 注意 ...
- exit在c语言里的作用,C语言中exit函数的使用
exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...
最新文章
- mysql 批量更新数据类型
- webform里的验证控件
- GAE Python 2009-3-22
- 为什么一般不将'在制品转出科目'设为初级成本要素
- caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)
- sqlserver compact sdf, sqlite 数据库 在net中相对路径设置方法 - 摘自网络
- Storm对DRPC权限控制Version1.0.1
- 深度剖析python_汉诺塔问题深度剖析(python实现)
- 2d绘制 c# dx_C# 从零开始写 SharpDx 应用 绘制基础图形
- github-新建文件夹
- Prototype使用Form.Element操作表单控件
- Unity3D 发布APK安卓环境配置步骤、安装、教程(含Java/Android)(超全流程)
- 高清数字电视视频处理器画质增强技术简介
- Python数据处理Tips机器学习中文数据8种常用处理方法
- nginx过滤post请求头_nginx屏蔽指定请求头访问
- matlab 5 .封装:幅频特性
- css颜色和长度简写
- 用c语言编写kcl方程,求助各位大手子 求了好多次都不对 用kvl kcl求出电容c
- java马士兵笔记_马士兵java教程笔记2
- 执行计划管理 (SPM)
热门文章
- 编程中函数的返回值的定义问题的解决
- Delphi程序员代码编写标准指南
- 线段树segment_tree go语言实现
- stm32中#ifndef __LED_H的作用
- python中 .sort()、 sorted()和 .reverse() 、reversed()的区别
- NullPointerException: null 报错
- Photoshop画笔的混合算法实现(逆推)
- Head First JSP---随笔八(传统标记)
- PAT——个位数统计(1021)
- 百度浏览器支持html5,百度手机浏览器完美驾驭HTML5