【C语言】结构体自引用与传参原则

news/2025/2/11 5:03:51/

本篇文章目录

  • 1. 结构体自引用
  • 2. 结构体传参

1. 结构体自引用

借助结构体的自引用可以形成一个链表。

错误示范:

#include <stdio.h>
struct Node
{int data;struct Node next;
};
// 大小是多少呢?
int main() {printf("%d", sizeof(struct Node));return 0;
}

这段代码甚至都不能编译过去,原因在于逻辑上就说不通,因为这么写的话这个结构体的大小是无穷大的。data占四个字节这是确定的,但next占多少个字节是无法计算的。struct Node里面包含int和struct Node,那么这个结构体中的struct Node当中又有int和struct Node,这样可以无穷无尽地套娃下去…所以这是错误的!

正确使用:

#include <stdio.h>
struct Node
{int data;struct Node* next;
};int main() {printf("%d", sizeof(struct Node));return 0;
}

只存储下一个节点的地址,通过这个地址能找到下一个节点,这样就能串起来形成一个链表!

2. 结构体传参

不好的使用方式:

#include<stdio.h>
struct S
{int data[1000];int num;
};
void print(struct S s)
{for (int i = 0; i < 1000; i++) {printf("%d ", s.data[i]);}printf("\nnum = %d\n", s.num);
}
int main()
{struct S s = {{1,2,3,4}, 1000};print(s); return 0;
}

原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

更好的使用方式:

#include<stdio.h>
struct S
{int data[1000];int num;
};
void print(struct S* ps)
{for (int i = 0; i < 1000; i++) {printf("%d ", ps -> data[i]);}printf("\nnum = %d", ps -> num);
}
int main()
{struct S s = { {1,2,3,4}, 1000 };print(&s); return 0;
}

这样并不会像系统申请额外的内存空间,就不会有额外的内存开销。


http://www.ppmy.cn/news/1122189.html

相关文章

哈希 -- 开散列(哈希桶)

拉链法 这里我们要是用string&#xff08;string来做key&#xff09;来取模&#xff0c;再增加一个模板参数&#xff0c;配一个取模的仿函数即可

SAP PO运维(四):适配器消息监控

登录SAP PO系统,点击“Configuration and Monitoring Home”,使用PISUPER账号登录: 2、选择“适配器引擎->消息监控器”: 3、查看是否有报错消息: 双击报错的数字,筛选出报错的条目(可以根据状态、接口命名空间等来筛选):常见的报错消息有: 接口配置问题:字段为空值…

1789_MIT 6.828 实验室3:用户环境要求翻译

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 简介 在这个实验室中&#xff0c;您将实现运行受保护的用户模式环境&#xff08;即“进程”&#xff09;所需的基本内核功能。您将增强JOS内核&#xff0c;以设置…

ssh 免密码登录远程服务器最佳实践

文章目录 场景实现 场景 工作中遇到需要使用多个云平台多个k8s集群的情况. 某些云平台不能使用desktop访问, 所以只能远程登录到指定访问权限的虚拟机. 在这个前提下一般是指知道这些虚拟的ip, user 以及 password. 使用ssh登录每一次都需要输入密码, 使用scp拷贝的时候也涉及…

Flink TaskManger 内存计算实战

Flink TaskManager内存计算图 计算实例 案例一、假设Task Process内存4GB。 taskmanager.memory.process.size4096m 先排减JVM内存。 JVM Metaspace 固定内存 256mJVM Overhead 固定比例 process * 0.1 4096 * 0.1 410m 得到 Total Flink Memory 4096-256-410 3430m 计…

基于下垂控制的并网逆变器控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要模块&#xff1a; 建议使用MATLAB2021b及以上版本打开&#xff01; 功率计算模块、下垂控制模块、电压电流双环控制模块、虚拟阻抗压降模块 扰动设置&#xff1a; 在0.5秒到2秒始端设置0.25Hz的电网频…

数据分享|R语言生态学种群空间点格局分析:聚类泊松点过程对植物、蚂蚁巢穴分布数据可视化...

全文链接 :https://tecdat.cn/?p33676 点模式分析&#xff08;点格局分析&#xff09;是一组用于分析空间点数据的技术。在生态学中&#xff0c;这种类型的分析可能在客户的几个情境下出现&#xff0c;但对数据生成方式做出了特定的假设&#xff0c;因此让我们首先看看哪些生态…

Learn Prompt- Midjourney 图片生成:基本设置和预设

/settings指令为模型版本、样式值、质量值和升级器版本等常用选项提供切换按钮。 备注 添加到提示末尾的参数将覆盖/settings中的设置。 模型版本​ 1️⃣ MJ Version 12️⃣ MJ Version 23️⃣ MJ Version 34️⃣ MJ Version 45️⃣ MJ Version 5&#x1f308; Niji Mode&a…