结构体

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

  1. struct STU{
  2. int age;
  3. char name[15];
  4. };
  5. struct STU a; //结构体实例
  6. 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的整数倍的字节处开始分配空间。

可设几字节对齐如下

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

1、结构体大小

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

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

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

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

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

(1)、

  1. struct TEST{
  2. int a;
  3. short b;
  4. char c;
  5. struct TEST *next;
  6. };

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

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

  1. struct TEST1{
  2. short d;
  3. int e;
  4. char f;
  5. struct TEST g;
  6. struct TEST1 *next;
  7. struct TEST h;
  8. char i;
  9. };

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

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

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

  1. struct TEST2{
  2. short d;
  3. int e;
  4. double f;
  5. struct TEST1 *next;
  6. struct TEST g;
  7. char i;
  8. };

分析如下: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. Noip模拟71 2021.10.7

    T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...

  2. TCP/IP参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104597450 学习课程:<2019王道考研计算机网络> 学习目的 ...

  3. MVC下垃框的使用

    --------------模型-------------------- /// <summary> /// 状态 /// =0 下架 =1 上架 /// </summary> ...

  4. DeWeb发展历程! 从2015年开始

    有位朋友问: [高中]长兴(667499XX) 2021-01-15 15:52:11 deweb会长期做吗 我查了一下,发现deweb最早从2015开始,算起来已经做了5~6年了,目前已日臻成熟!

  5. SpringBoot配置文件自动映射到属性和实体类(8)

    一.配置文件加载 1.Controller中配置并指向文件 @Controller @PropertySource(value = { "application.properties&quo ...

  6. 性能工具之代码级性能测试工具ContiPerf

    前言 做性能的同学一定遇到过这样的场景:应用级别的性能测试发现一个操作的响应时间很长,然后要花费很多时间去逐级排查,最后却发现罪魁祸首是代码中某个实现低效的底层算法.这种自上而下的逐级排查定位的方法, ...

  7. idea中的maven模块变成灰色

    问题 在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 解决方法 方法一 造成这个的原因可能是忽略了maven模块,可以尝试如下解决方法:在idea中maven中找到ignore ...

  8. css 跑马灯加载特效

    css 跑马灯加载特效 <!DOCTYPE html> <html lang="en"> <head> <meta charset=

  9. MySQL基础语句(修改)

    ①INSERT INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80); 向students表插入 ...

  10. Java核心技术--Java程序设计

    Java术语 术语名 缩写 解释 Java Development Kit(Java开发工具包) JDK 编写Java程序的程序员使用的软件 Java Runtime Environment(Java ...