背景 定义了两个一样的共同体,共同体内还有几个结构体,共同体中最后有一个数组,将所有的数据包括在内,将来赋值好赋。但是赋值后,总是有很多数据跨越了两个共同体。 解决 赋值用的是for,for的循环次数原来是个计算出来的值,现在改成常数,还是不对。 查看Memory中的数据,的确是跨越了。 - typedef uion{
- struct {
- int aa;
- int bb;
- int cc[3];
- } dd;
- int e_buf[5];
- int f_buf[8];
- int g_buf[9];
- int all_buf[22];//正确为27
- }hh;
- hh ii,jj;
复制代码
发现每次共同体jj的数据总是赋给共同体ii的最后5个数据,将共同体ii与jj的存储位置互换后,又是共同体ii的数据赋值给了共同体jj的最后5个。 ii与jj在这个工程中正好存储地址是紧挨着的,所以才有这样的问题,要是不挨着,则会产生随机数,问题更难发现了。 重新计算共同体的占用空间,发现共同体最后的那个总的数组少计算了5个字节,更改后,赋值正确了。 延伸 共同体与结构体在处理数据的时候的确很方便,但是要是用的不当,就会出这些问题。 在使用的时候,尤其是有共同体的时候,最好用sizeof函数先调试一下,看看跟你计算的一不一样。
|