结构体初始化中遇到的问题
对于普通的结构体来说,初始化可以直接在结构体内部进行,这一点对于成员比较少的结构体来说还是比较方便的,如下:
struct StTest
{
int iNum;
char chNum;
long lNum;
StTest()
{
iNum = chNum = lNum = 0;
}
};
这种对于比较少量的成员来说是比较简单的,但是对于成员变量比较多的情况下会显得比较麻烦。
因而引入了另一种方式:memset
memeset()函数是用于整块内存初始化使用的,因此可以实现批量的初始化,如上面的结构体的初始化方式为:
StTest test;
memset(&test, 0, sizeof(StTest));
从函数即可发现,是将分配给对象test所占的内存全部设置为0。
注意,是test所占的内存。
由此引出一个问题:
对于不定长度,或者是含有QByteArray之类的结构体的初始化是否可以使用memset函数???
答案是***否定的***。
这个原因在我进行测试的时候发现,对于含有QByteArray的结构体,其无论QByteArray是空,还是拥有任意长度的内容,其所占的大小永远是4个字节(32情况下),如果对含有QByteArray的结构体进行sizeof求大小,得到的是不包含这个字节数组内容的大小。
对于这一点,通过查阅手册(虽然没有查到),我的一个猜测是,QByteArray相当于char*,代表的是一个指向具体内容的指针。
如果通过memset的方式进行初始化,此时这个相当于指针的QByteArray,就被初始化为了0X00000000,那么就相当于这个地址被擦除重写了,在编译的时候并不会报错,但是在执行的时候,会发现在“函数退出”的时候,这个值发生了问题(前提是在这个被调用的函数里面定义了一个这个结构体的临时变量)。
因为在调用函数结束的时候,这个临时变量被释放,但是注意,此时这个指针的值,变成了0X00000000,相当于释放这个地址的值,访问非法内存自然而然会出现问题。
总结:
对于含有类似于QByteArray的结构体,无法使用memset函数进行全员的初始化(但是可以进行不包括QByteArray的部分的部分初始化),原因在于,QByteArray相当于一个char*类型的指针(自己的理解,不知道正不正确),在使用的时候需要注意。