结构体

结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充。

struct STU{
int age;
char name[15];
}; struct STU a; //结构体实例
struct STU *b; //结构体指针

1、可以通过a.age对其进行取成员的操作,b->age也可以进行结构体的操作,b->age存在问题,必须有一个结构体空间已经让b指向,b的值为此结构体空间的地址。

2、a.name = "lilei"; false,因为name是数组名称,指针常量不能赋值,解决方案:strcpy()函数

3、字符串直接进行比较的话,是其地址的比较,没有什么意义,用strcmp()函数进行比较,就是ASCII码的比较了。

内存对齐

操作系统对于内存空间的分配,遵循如下原则:总是从2^n倍数为地址的字节处开始分配空间。

如:若按4B对其模式的话,则每个变量(结构体成员)的首地址总是从编号为4的整数倍的字节处开始分配空间。

可设几字节对齐如下

#pragma pack(push)    //保持原对齐格式
#pragma pack(1) //设定为n字节格式 ....... #pragma pack(pop) //恢复为原对齐格式

1、结构体大小

(1)、总大小是下一个类型的整数倍,否则用单字节补齐(单字节最多补到4/8,具体看结构体中最宽几字节)

//总大小指的是前面字节总数和当前的字节数之和

(2)、结构体大小是最宽字节的整数倍(一般情况下为4或8)

(3)、上述两个条件必须同时成立。若最终结果不成立的话,则补齐整数倍即可

2、下面举例论证结构体大小

(1)、

struct TEST{
int a;
short b;
char c;
struct TEST *next;
};

分析如下:4->2->1 (补1字节)->4 共12字节

(2)、借用(1)中的结构体

struct TEST1{
short d;
int e;
char f;
struct TEST g;
struct TEST1 *next;
struct TEST h;
char i;
};

分析如下:2(补2字节)->4->1(补3字节)->12->4(想补也不能补,最多补到最宽单字节,在这最多到4字节,已经为4字节了,所以不能在补了)->12->1。

一共为:41字节,但是结构体大小为最宽单字节的整数倍,在这应为4的整数倍,最终,此结构体大小为44字节。

(3)、借用(1)中的结构体

struct TEST2{
short d;
int e;
double f;
struct TEST1 *next;
struct TEST g;
char i;
};

分析如下:2(补2字节)->4->8->4(补4字节:前面一共16字节,当前4字节,所以总共20字节,不是下一个数据类型(12)的整数倍,且最宽为8字节,可补4字节,构成整数倍)->12->1。

一共为37字节,但是结构体大小为最宽单字节的整数倍,在这应为8的整数倍,最终此结构体大小为40字节。

结构体类型极大的扩充了C语言,是数据类型更加丰富多彩。

C语言中内存对齐与结构体的更多相关文章

  1. C语言中内存对齐规则讨论(struct)

    C语言中内存对齐规则讨论(struct) 对齐: 现代计算机中内存空间都是按着byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地 ...

  2. C语言中内存对齐方式

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  3. C语言中内存对齐

    今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个 ...

  4. C语言中的系统时间结构体类型

    在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:0 ...

  5. c语言中内存对齐问题

    在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的“管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上 ...

  6. VC++中内存对齐

    我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体. 为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则.但是,不同的编译器可能有不同的实现,本 ...

  7. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  8. <摘录>字节对齐与结构体大小

    说明: 结 构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一 些笔试面试题目中出是常常出现,对sizeo ...

  9. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

随机推荐

  1. 零基础入门C语言超详细的字符串详解

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  2. 攻防世界 杂项14.Erik-Baleog-and-Olaf

    下载解压后用notepad++打开 发现是一个PNG的图片文件,该后缀,再用Stegsolve打开看一下, 发现一个残缺二维码,果断在线PS补全 扫码得到flag flag{#justdiffit}

  3. hdu 1158 Employment Planning(DP)

    题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...

  4. 从零开始搭建你的nvim ide

    前言概述 vim由于其丰富的扩展性.出色的跨平台性.高效率的操作性深受一大批粉丝的追捧,甚至就连vim和emacs之间孰优孰劣的话题都能被引起一场编辑器之间的圣战,足以见vim是多么的优秀. vim的 ...

  5. 攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup

    攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup 题目介绍 题目考点 隐写术 摩斯密码 Writeup 下载附件是PDF文件打开,研究一 ...

  6. Maven打包web项目报错:webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update)

    问题描述 使用Maven打包项目的时候,出现错误: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing ...

  7. mapper接口绑定异常

    前言 由于MP的代码生成器把mapper接口绑定的写sql语句xml文件创建在java目录下,而Maven加载机制只会将.java文件编译成.class文件,所以在target目录下找不到写xml文件 ...

  8. node 中第三方模块的加载过程原理

    node 中第三方模块的加载过程原理 凡是第三方模块都必须通过 npm 来下载 使用的时候就可以通过require('包名') 的方式来进行加载才可以使用 不可能有任何一个第三方包和核心模块的名字是一 ...

  9. [python]django关闭debug

    1.版本声明 python3.6.5 django2.0.6 2.打开项目-setting setting.py中DEBUG默认是等于True,这样的话当访问接口存在错误会直接展示项目的所有配置信息, ...

  10. C# 复制目录及其下文件

    public static void CopyDirectory(string sourceDirPath, string saveDirPath) { try { if (!Directory.Ex ...