C语言之结构体与GDB调试 -----Day17

一.知识点整理

1.结构体

1.1 定义

  • 形式
    struct 结构名
    {
    成员列表(类型说明符 成员名)
    };
    举个例子:
struct student{
      int num;
      char name[20];
      char sex;
      int age;
      float score;
      char addr[30];
  };

1.2 定义结构体变量方法

  • 先声明结构体再定义变量名

struct student1,student2…

struct student{
      int num;
      char name[20];    
  } 

int main()
{
	struct student1;
}
  • 声明类型的同时定义变量
struct student{
      int num;
      char name[20];   
  } student1,student2; //会把student1当做全局变量

  • 直接定义结构体类型变量
    一般格式:
    struct

        成员表列
      }变量名表列;

1.3 结构体变量的引用

  • 引用规则
  1. 不能把一个结构体变量作为一个整体进行输入输出,通过"."来引用结构体的变量,这里的点可以理解为“的”的意思
  2. 如果结构体里面嵌套另一个结构体则需要一级一级的引用下去
  3. 对结构体变量可以向普通变量进行运算
  4. 可以引用结构体变量的地址,也可以引用结构体地址

1.4 结构体数组

定义一个多个学生的结构体,代码如下:

struct student{
		int num;
		char name[20];
		char sex;
		int age;
		float score;
		char addr[30];
 };

int main(){
	struct student[10];
}

1.5 结构体指针

  • 一般形式

struct 结构名 *结构指针变量名

  • 使用时需要注意

结构指针变量必须先赋值,再引用
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。

  • 将一个结构体变量的值传递给函数,有以下方法
  1. 用结构体变量的成员做参数
  2. 用结构体变量做实参
  3. 用结构体变量(或数组)的指针作为实参,将结构体变量(或数组)的地址传给形参

2. GDB调试

2.1 gdb简介

  • gdb调试的是可执行文件,而不是程序的源代码,编译时添加:

gcc -g 源文件名称

2.2 gdb操作

  • 显示源代码【可以用简写l】

list:显示10行代码
list x,y :显示x行至y行的代码

  • 开始运行命令【可以用简写r】

run

  • 设置和管理断点

break n :在第n行设置断点,与run和continue连用

  • 下一步操作

next:表示下一步,不进入函数
step:表示下一步,进入函数

  • 跟踪显示

display 变量名

二. 难点重点

1. 如何计算结构体的大小

首先需要满足一下几个规则:

第一步看操作系统:32位或64位
对齐字节数:32位默认4,64位默认8

第二步看结构体最大元素的字节数
必须为最大字节数的整数倍或者对齐字节数的整数倍,不满足则在后面补位;

第三步看是否有数组,如果有数组,不能将数组的大小看成一个整体,需要分开来看

最后一步:起始位置x对存放的元素大小要恒等于0,或对对齐字节数区域恒等于0,若不满足,则补位;

举个列子

//64位操作系统下计算该结构体的大小
struct s1{
	char ch;
	int a;
	char d;
	float;
	double d;
	int c;
};

首先,判断最大元素的字节数为double类型,为8,
然后,在判断下一个元素类型的字节数为4,则第一位需要补3,第三位为char类型,此时为序号为8,加上char为9,不符合需要补位3,为12
后面为float型,字节数为4,可以整除,加4,为16,
再加double型为24,
再加int为4,一共为28,不被8整除,所以再补4,为32;
最后结构体的总大小为32!

三.总结

结构体的知识相对比较实用,可以将一个个实体以及他们所具有的特征在一起进行处理,gdb的调试也对编程有了跟大的辅助帮助作业

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值