结构体的基础知识及存储分配

一、结构体的访问

1.结构体成员的的直接访问,如下结构体:

struct  A{

int a;

long *b;

char c[20];

};

struct A   com;

结构体成员通过操作符"."访问,表达式com.a的结果是个数组名,可以把它使用在任何可以使用数组名的地方,com.a[4],将选择一个数组元素。

2、结构体成员的间接访问

struct A *p;

可以使用(*p).a访问结构体成员,但这种形式有点不简洁所以使用操作符"->"来访问结构体成员,箭头操作符对左操作数执行间接访问来获取指针所指向的结构,然后根据右操作数来访问一个成员,p->a。

二、结构体的自引用

struct B{

int a;

struct B b;

int c;

};

这种引用是不合法的,因为b是一个完整的结构,第二个成员又是另一个完整的结构,还包括她自己的成员,这样会循环下去无法及所结构体的大小。

struct B{

int a;

struct B  *b;

int c;

};

这种声明是合法的,b现在是一个指针它所占的字节数是已知的,可以计算出结构体的大小,这种自引用是合法的。

三、结构体、指针和成员

typedef   struct{

int a;

short b[2];

}Ex1;

typedef   struct{

int a;

char b[3];

Ex1 c;

struct Ex1 d;

}Ex2;

Ex2 x={1,"My",{2,{3,4}},0};

Ex2 *p=&x;

如下图来表示此结构:

创建一个指向整型的指针:int *p1;若要使它指向整型成员a,应使用&取得一个指向p->a的指针:p1=&p->a.

访问嵌套的结构体:p->c.a即为访问c结构体中的整形a。

访问指针成员:定义另一结构:Ex y;     x.d=&y;则Ex->d->c.b[1]=4;则表示如下图空间:

四、结构体的内存对齐

对齐规则

每个特定平台上的编译器都有自己的默认“对齐系数”,也可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

规则:

1、数据成员对齐规则:struct数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。(即第一个数据成员以后的成员的偏移地址为#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个的整数倍)

2、struct的整体对齐规则:在数据成员完成各自对齐之后,结构体本身也要进行对齐,对齐将按照#pragma pack指定的数值和struct最大数据成员长度中,比较小的那个进行。

3、当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

当结构体里面包含另一结构体时,直接将该结构体中的内容代换进去,计算其总的存储空间即可。

例:(在此平台上int占4个字节)

虽然A和A1所包含的成员相同,但A占了12个字节,A1占8个字节,所以在声明中对结构体列表的排列,因该让边界要求严格的成员首先出现(数据成员自生长度大的先出现)

时间: 2024-10-07 08:39:02

结构体的基础知识及存储分配的相关文章

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

MySql基础知识、存储引擎与常用数据类型

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据类型 1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结:数据永远是数据库的核心. 1.2.关系数据库管理系统 通过"数据库管理系统",数据

C语言结构体在内存中的存储情况探究------内存对齐

条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类型:%d\n", sizeof(int)); printf("float类型:%d\n", sizeof(float)); printf("double类型:%d\n", sizeof(double)); return; } 结果: 先来一下, 这个结构体在内

【C语言】结构体占用字节数及存储与空间分配

我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子: 1. struct A { char a; int b; short c; }str1; 这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图: 1 2 3 4 a       b b b b c c     由于a占

结构体简单理论知识

为什幺使用结构体 有的时候我们需要把不同类型的数据封装成一个整体,以便于引用. 结构就类似于类 一个类就是将方法属性封装起来 而结构简单说是将 一些变量组合在一起. 定义一个结构的一般形式 struct 结构名 { 成员列表   //必须进行类型声明 }变量名表列; 例如: struct People { char *name; char sex int age; }people1,people2; 结构的嵌套定义: struct Date { int year; int month; int

【转】结构体struct相关知识

第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明. 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述. 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器

C++基础知识——变量存储位置

1.栈区(stack):程序运行时由编译器自动分配 存放:函数的参数值,局部变量的值. 存储连续,其操作方式类似于数据结构中的栈. 栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的,所以空间有限,windows下大多1-2M. 2.堆区(heap): 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 . 存放:程序员申请的内存空间. 存储不连续,数据结构中的堆是两回事,类似于链表,受限于虚拟内存,32bit系统可达到4G. 堆区是向上增

【入门篇】Android学习笔记——项目结构及相关基础知识

Android项目具有其自身的结构规范,完好的遵循结构规范,可以让开发事半功倍.下图分别从Android视图和Project视图展示了Android项目的项目结构: 图中左侧是Android视图,右侧是Project视图.从两个结构图的对比,可以发现Android视图更加关注Android开发工作,而Project视图更加关注整体结构,虽然两个视图有一些不同,但主体结构并没有什么区别. 接下来,主要通过Android视图,描述一下Android项目中各个目录的用途和含义,明白Android视图中

C语言之结构体(2)

无意侵权:http://www.cnblogs.com/zhouxuanyu/p/4514754.html 再识C中的结构体 在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下: 1 #include<stdio.h> 2 #define LEN 20 3 4 struct Student{ //定义结构体 5 char name[LEN]; 6 char address[LEN]; 7 int age; 8 }; 9 10 int main(int argc, ch