对于结构体的初始化问题

结构体初始化中遇到的问题

对于普通的结构体来说,初始化可以直接在结构体内部进行,这一点对于成员比较少的结构体来说还是比较方便的,如下:

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*类型的指针(自己的理解,不知道正不正确),在使用的时候需要注意。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值