memset中sizeof(动态分配的数组)的问题
2016-03-06 14:59
267 查看
数组初始化的时候常用for()循环,不过如果考虑效率的话,最好用memset(),下面简单介绍以下memset()。
函数原型:
void *memset(void *s, int ch, size_t n)
函数解释:将s中前n个字节替换为ch并返回s;
memset:它包含在<memory.h>或者<string.h>中。作用是在一段内存块中填充某个给定的值,它的操作对象为单个字节,是对较大的结构体或数组进行清零操作的一种最快方法。
提到memset()就不得不提到sizeof(),因为sizeof()使用不好可能给memset()带来很隐蔽的错误:
上面这段代码是不能达到对a[]清零的目的的,因为some_func()函数的参数已退化为指针,而不是数组对象,因此这里的sizeof(a)在32位机器上返回的应该是4,而不是a[]数组的长度(所占字节数)。
sizeof是C/C++中的一个操作符(operator),而不是函数,其作用就是返回一个具有明确类型的对象或者类型所占的内存字节数。
同理
也不能达到初始化的目的
c++ primer中sizeof 的解释如下:
1.对char或值为char类型的表达式做sizeof操作得1
2.对引用类型做操作返回存放引用的对象所需的内存空间大小
3.对指针做sizeof操作将返回存放指针所需内存空间的大小;注意如果要获取存放改指针所指向的对象的大小,则必须对该指针进行解引用。
4.对数组做sizeof操作等效于对元素类型做sizeof的结果呈上数组的大小
函数原型:
void *memset(void *s, int ch, size_t n)
函数解释:将s中前n个字节替换为ch并返回s;
memset:它包含在<memory.h>或者<string.h>中。作用是在一段内存块中填充某个给定的值,它的操作对象为单个字节,是对较大的结构体或数组进行清零操作的一种最快方法。
提到memset()就不得不提到sizeof(),因为sizeof()使用不好可能给memset()带来很隐蔽的错误:
int some_func(struct something *a){ … … memset(a, 0, sizeof(a)); … }
上面这段代码是不能达到对a[]清零的目的的,因为some_func()函数的参数已退化为指针,而不是数组对象,因此这里的sizeof(a)在32位机器上返回的应该是4,而不是a[]数组的长度(所占字节数)。
sizeof是C/C++中的一个操作符(operator),而不是函数,其作用就是返回一个具有明确类型的对象或者类型所占的内存字节数。
同理
bool *SampleLabel = new bool[vtxCount]; memset(SampleLabel, false, sizeof(SampleLable));
也不能达到初始化的目的
c++ primer中sizeof 的解释如下:
1.对char或值为char类型的表达式做sizeof操作得1
2.对引用类型做操作返回存放引用的对象所需的内存空间大小
3.对指针做sizeof操作将返回存放指针所需内存空间的大小;注意如果要获取存放改指针所指向的对象的大小,则必须对该指针进行解引用。
4.对数组做sizeof操作等效于对元素类型做sizeof的结果呈上数组的大小
相关文章推荐
- JVM调优总结(十)-调优方法
- 课程设计__分数的计算
- DataBase -- FUNCTION
- js判断undefined类型
- 创建Car类
- 数组中的趣味题一
- 二维数组和二级指针
- MySQL的安装
- hdoj 5630 Rikka with Chess
- 第一周学习进度条
- CodeForces - 626B Cards (全排列&模拟)
- tls和ssl
- 重构(改善既有代码的设计)--读书笔记2
- mongodb 的简单使用
- 巧妙的实现一套键鼠无缝控制两台联网的主机
- IO模型
- AngularJS页面访问时出现页面闪烁问题的解决
- vs2013编译 x264
- 清除系统日志的shell脚本
- 层次概率聚类算法