使用动态内存开辟和结构体指针传参结合时遇到的问题和解决方法

本文讨论了在通讯录实现中,如何处理结构体指针与动态内存的关系,包括传参时对首元素指针与结构体指针的区别,以及如何避免内存泄漏和野指针问题。作者分享了实验经验和解决方案,提醒读者注意内存管理的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是在实现通讯录的简单实现和动态内存开辟中遇到的问题和解决办法;感兴趣可以看我另一篇《通讯录的简单实现和动态内存开辟结合》希望对你有所帮助。

一、结构体指针的相关知识:

1.取址所得到地址代表的是指向结构体的指针,只是在数据上和结构体中的首元素地址相同;

即,可以理解为两个指针p1(指向首元素)==p2(指向结构体)同时指向结构体的起始地址;

2.正常情况下两者都可以通过->找到结构体成员(通过的是结构体内存分配规则向后寻找相应的成员地址)分配规则详见:结构体的内存分配机制 - 邱明成 - 博客园 (cnblogs.com)

二.结构体的传参(和动态内存开辟结合):

调用Inicial函数时:

实参是p2:指向结构体的

形参是p1:指向首元素的

example:

从上面可以得知,在函数中改变的是p1,并不会影响p2;

p1被改变后指向了calloc开辟的一段内存的起始地址;

在main中再传参给函数时,形参又会变回和p2等同的值;因为函数结束时p1的值同时丢失,在后来程序中无法再free,可以理解为丢失了calloc开辟的内存(内存泄漏);

ps:经过实验(太麻烦了就不展示)得知:

在该函数中通过p1初始化结构体成员其实是新开辟空间的中的某些地址区块代表的数据(通过结构体内存分配规则来寻找的)

所以在后来去尝试函数realloc来扩容或者减容时,函数中的结构体指针本身又并未指向已经初始化的地址(被编译器认为是野指针),就会导致使用realloc时编译器报错或者出现内存无法识别的问题;

以上是我通过查阅多方资料和自己不段调试找到的问题源头和解决方法,如有不准确的地方请大佬们不吝赐教

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值