以下是在实现通讯录的简单实现和动态内存开辟中遇到的问题和解决办法;感兴趣可以看我另一篇《通讯录的简单实现和动态内存开辟结合》希望对你有所帮助。
一、结构体指针的相关知识:
1.取址所得到地址代表的是指向结构体的指针,只是在数据上和结构体中的首元素地址相同;
即,可以理解为两个指针p1(指向首元素)==p2(指向结构体)同时指向结构体的起始地址;
2.正常情况下两者都可以通过->找到结构体成员(通过的是结构体内存分配规则向后寻找相应的成员地址)分配规则详见:结构体的内存分配机制 - 邱明成 - 博客园 (cnblogs.com)
二.结构体的传参(和动态内存开辟结合):
调用Inicial函数时:
实参是p2:指向结构体的
形参是p1:指向首元素的
example:
从上面可以得知,在函数中改变的是p1,并不会影响p2;
p1被改变后指向了calloc开辟的一段内存的起始地址;
在main中再传参给函数时,形参又会变回和p2等同的值;因为函数结束时p1的值同时丢失,在后来程序中无法再free,可以理解为丢失了calloc开辟的内存(内存泄漏);
ps:经过实验(太麻烦了就不展示)得知:
在该函数中通过p1初始化结构体成员其实是新开辟空间的中的某些地址区块代表的数据(通过结构体内存分配规则来寻找的)
所以在后来去尝试函数realloc来扩容或者减容时,函数中的结构体指针本身又并未指向已经初始化的地址(被编译器认为是野指针),就会导致使用realloc时编译器报错或者出现内存无法识别的问题;
以上是我通过查阅多方资料和自己不段调试找到的问题源头和解决方法,如有不准确的地方请大佬们不吝赐教