您的位置:首页 > 其它

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()带来很隐蔽的错误:
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的结果呈上数组的大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: