

码龄10年
暂无认证
34133访问
1
等级
8获赞
3
评论
热门文章
-
一.某岛之人物对象及其加密函数解析
2147
-
一.《传奇M》装备栏遍历的突破口
1790
-
二.某龙端游中LUA的分析和调用
1539
-
一.《轩辕传奇》周围遍历之二叉树
1386
-
一.《UE4奥丁》人物最大属性
1331
最新评论
-
20240228阿⑤
积分乍获得
-
20231124ziher
666
-
20230909八月老师
什麼時候發佈易語言支持庫呢
六.结构体指针数组的由来
Heart
2023-05-19 22:30:36 发布
358
分类专栏: 数据逆向 文章标签: 结构体 指针 数组
结构体指针数组的由来
1.我们前面几节课讲到了结构体
2.并讲了结构性数组
3.如果记忆力还好的同学肯定记得我们提及过一个弊端
4.就是当结构性数组的元素过多 会显得数组整个字节大小非常的大
5.同是我们定义数组的时候 大小是固定的 也就是当定义数组就已经申请了固定大小的内存了
6.也就是说 这么大的一片连续的内存 有可能申请失败的
7.那么怎么解决呢?
结构体指针数组
1.这里就要想到 如果我们用数组只存我们结构的地址 不存实体
2.那么 比如1000个元素 结构大小为12
3.存实体 那么就是12000个字节 存地址就是 4*1000 也就是4千个字节
4.从数字上 我们就知道申请4000个字节 要比 12000个字节容易的多
5.所以我们看看结构体指针是怎么写的
结构性指针的创建
#include typedef struct INFO { char c; int id; float f; }INFO; INFO *g_pNum[1000] = { 0 }; int main() { sizeof(g_pNum);//我们这里可以观察到字节是4000 如果不是地址那么就是12000字节 printf("Hello Heart"); return 0; }
存数据
1.其实之前我们再C语言实战项目中已经用到了结构体指针数据了
2.我们是需要申请一个结构体大小的内存,来把地址存入这个数组中就可以了
3.写法很简单的 其实我们之前已经用到过这样的代码
#include #include"stdlib.h" #include "windows.h" typedef struct INFO { char c; int id; float f; }INFO; INFO *g_pNum[100] = { 0 }; int main() { sizeof(g_pNum); INFO *pINFO = (INFO*)malloc(sizeof(INFO)); ZeroMemory(pINFO,sizeof(INFO)); pINFO->c = 'H'; pINFO->id = 1001; pINFO->f = 666.66f; g_pNum[0] = pINFO; printf("Hello Heart"); return 0; }
读数据
1.用法和一般的数组是没有区别的
2.只是里面存的是结构体实体的首地址
3.我们访问是需要
g_pNum[0];//我们知道g_pNum[0]得到的事指针 指向的是实体 需要用->来访问 实体的成员变量 printf("%c\n",g_pNum[0]->c);
4.遍历和一般的数组遍历是一样的 没有任何区别
5.这里大家要注意
思考
1.我们判断当前元素是否没有数据 是有些繁琐的
2.这时候必须借助一个标志位来判断 比如某个成员变量等于0
#include #include"stdlib.h" #include "windows.h" typedef struct INFO { char c; int id; float f; bool bUse; }INFO; INFO g_pNum[100] = { 0 }; int main() { sizeof(g_pNum); g_pNum[0].c = 'H'; g_pNum[0].id = 1001; g_pNum[0].f = 666.66f; g_pNum[0].bUse = 1; if (g_pNum[0].bUse==1) { printf("%c\n", g_pNum[0].c); //才开始访问数据 表示有数据 } printf("Hello Heart"); return 0; }
改进成了结构体指针数据
1.判断就根据当前元素的地址释放为空
2.就能直接判断当前元素是否有值了
#include #include"stdlib.h" #include "windows.h" typedef struct INFO { char c; int id; float f; }INFO; INFO *g_pNum[100] = { 0 }; int main() { sizeof(g_pNum); INFO *pINFO = (INFO*)malloc(sizeof(INFO)); ZeroMemory(pINFO,sizeof(INFO)); pINFO->c = 'H'; pINFO->id = 1001; pINFO->f = 666.66f; g_pNum[0] = pINFO; if (g_pNum[0]) { printf("%c\n", g_pNum[0]->c); //才开始访问数据 表示有数据 } printf("Hello Heart"); return 0; }
总结好处
1.数组大小不臃肿 申请内存好申请
2.判断数据是否为空号判断


评论列表