滴水逆向三期笔记与作业——02C语言——08 结构体

本节课内容简单,仅截图记录

滴水三期

  • 一、什么是结构体
    • 结构体偏移
    • 结构体的定义与赋值
    • 结构体类型的参数
    • 结构体类型的函数返回
  • 二、作业

一、什么是结构体

结构体偏移

滴水逆向三期笔记与作业——02C语言——08 结构体_第1张图片

结构体的定义与赋值

滴水逆向三期笔记与作业——02C语言——08 结构体_第2张图片

结构体类型的参数

滴水逆向三期笔记与作业——02C语言——08 结构体_第3张图片
滴水逆向三期笔记与作业——02C语言——08 结构体_第4张图片

本质是内存数据的复制,将结构体中在内存存储的数据复制到新的内存中。与海哥教学视频中相比,现阶段的编译器做了较多的优化。

结构体类型的函数返回

滴水逆向三期笔记与作业——02C语言——08 结构体_第5张图片
滴水逆向三期笔记与作业——02C语言——08 结构体_第6张图片
rax中存放了一个内存地址,函数赋值时从rax所存储的地址(即rbp+0x10)开始存储数据,一共占用16字节大小,最后返回时,将起始值1的存储地址返回给rax,而rax在Function函数调用前代表了main函数的局部变量地址,即rbp-0x10。
总结就是使用地址来传递参数,而海哥教程里使用内存间相互复制值来传递,可见现阶段的编译器优化了过程。

二、作业

滴水逆向三期笔记与作业——02C语言——08 结构体_第7张图片

#include 
#include 
 
struct Point{
	float x;
	float y;
	float z;
};
 
struct Gamer{
	Point point;
	int blood;
	int level;
};
 
void Function0(Gamer gamer){
	printf("坐标是:%.2f    %.2f    %.2f\n", gamer.point.x, gamer.point.y, gamer.point.z);
	printf("血量是:%d\n", gamer.blood);
	printf("等级是:%d\n", gamer.level);
}
 
void Function1(){
	Gamer gamer;
	gamer.point.x = 1.1;
	gamer.point.y = 1.1;
	gamer.point.z = 1.1;
	gamer.blood = 100;
	gamer.level = 3;
	Function0(gamer);
}
 
int main(int argc, char* argv[]){
	 
	Function1();
 
	return 0;
}

在这里插入图片描述

你可能感兴趣的:(滴水逆向学习笔记,笔记,滴水逆向)