wrainp的笔记 https://bbs.21ic.com/?518140 [收藏] [复制] [RSS]

日志

结构体初探

已有 637 次阅读2008-4-16 21:08 |系统分类:嵌入式系统| struct

    以前没怎么仔细分析过结构体,对于其使用也是一知半解,今天有幸看到了《嵌入式C精华》这份资


料,讲的真好(后面的还不知道...)。


   首先要知道的是#pragma这个东东----


一句话,pragma就是为了让编译器编译出的CC++程序与机器硬件和操作系统保持完全兼容


而定义的宏扩展,#pragma是和特定编译器相关的。


1.下面对这段程序分析一下,基本上对结构体的对齐就有了基本的概念了:


  #include <iostream.h>



  #pragma pack(8) //最大8字节对齐



struct example1



{



short a;//2字节



long b; //与int一样,4字节,这里使 short对齐为4字节


};



struct example2



{



char c;//1字节



example1 struct1;//8字节,但分析example2的变量时要把struct1展开分析



short e;//2字节



};



#pragma pack()//不采用对齐



int main(int argc, char* argv[])



{



example2 struct2;//定义一个结构体变量struct2



cout << sizeof(example1) << endl;//4+4=8字节



cout << sizeof(example2) << endl;//四个成员中(两个是struct1的),最大的为4字


                                  //节,则都对齐为4字节,即4*4=16字节



cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;


//&struct2表示其第一个成员char c,而它已对齐为4字节.故8-4=4字节


return 0;



}


2.结构体中有指针的情况


structA instant1,instant2;//定义两个结构体变量


instant2 = instant1 赋值语句采用的是变量逐个拷贝,这使得instant1 和instant2 中的


cMember 指向了同一片内存,因而对instant2 的修改也是对instant1 的修


改。


在C 语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2 个实例中


的指针型成员指向了同一片内存。


在C++语言中,当结构体中存在指针型成员时,我们需要重写struct 的拷贝构造函数并进行


“=”操作符重载。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)