目的
c语言当中习惯用sizeof获取变量大小,然后,根据这个大小memset一下这个变量。
但在c++语言当中再次使用就要注意了。
我就在项目中这样用,结果报错了,细查才找问题是这个原因,特此记一下,以分享给大家。
情况
下面就做一个例子,说明一下这个情况:
代码如下:
#include <QtCore/QCoreApplication>
#include <QString>
typedef struct _student
{
int id;
QString name;
float score;
}Student;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Student stu;
memset(&stu, 0, sizeof(Student));
printf("sizeof(int)=%d, sizeof(float)=%d, sizeof(小明)=%d, size=%d\n", sizeof(int), sizeof(float), sizeof("小明"), sizeof(Student));
stu.id = 1;
stu.name = "小明";
stu.score = 80;
printf("id=%d,name=%s,score=%f\n", stu.id, stu.name.toStdString().c_str(), stu.score);
return a.exec();
}
运行如下:
显示到了18行,才报出了QString数据结构破坏的错误!
首先sizeof(QString)获取它的大小就是一个错误,因为QString的大小是动态变化的,而sizeof()只能获取基本数据类型的大小,获取编译时确定大小的类型
而memset也不适合QString,因为QString内存里面有内部数据结构,如果memset了,那么就破坏了QString内部的数据结构,而基本类型,内部是无数据结构的
关于sizeof的用法:
在 C 语言中,sizeof 是一个运算符,用来获取一个数据类型或数据结构在内存中所占的字节数。它是一个编译时运算符,不会在运行时进行计算,而是由编译器在编译时确定大小。
语法:
sizeof(数据类型)
或者:
sizeof(任何有效表达式)
sizeof会返回该表达式结果的类型大小。
使用
获取基本数据类型的大小
sizeof 可以用于查询基本数据类型(如 int、float、char)的大小。
关于memset
memeset 作用是将一段内存的数据全部设置为指定值,函数原型为:
void *memset(void *dest,int c,size_t count);
头文件:
使用时引入<memory.h>头文件
作用:
将dest指针指向的内存区域的前count个字符设置为c,并返回指向这个存储区的指针。
总结
sizeof(),memset(),只适合基本数据类型,对于复杂数据类型是不适合的,因为复杂数据类型里面有自己的数据结构,比如:如引用计数、指针等。
如下图所示:
比如,拿QString数据类型来说:
如果把这些成员变量memset之后,这个QString就没法用了。
QString 通过 clear()函数进行清空即可。