问题描述
定义List
是指向自定义结构体的指针,且PtrL
也是List
类型,有如下代码:
List p=PtrL; //指针PtrL赋给指针p
... //省略语句
free(p); //执行完后释放指针p
执行完上述语句后,再次调用参数为PtrL
的函数:
function(PtrL);
在函数function
内部读取PtrL
时出现报错:读取访问权限冲突。
解决方案
- 删去释放指针
p
的语句free(p)
,等待全部代码执行完之后再释放; - 在
free(p)
前加上一行:p=NULL
;
原因阐述
当指针PtrL
赋值给指针p
时,实际上两个指针指向的都是同一块内存空间,可以理解为PtrL
和p
是同一块内存空间的不同名字。
所以释放了p
就相当于释放了此内存空间,之后再调用PtrL
自然会触发读取访问权限冲突。
所以如果要释放指针p
应当先将其指向改为NULL
再行释放,或者直接等到程序全部运行结束再释放(注意不要释放在p
之后还释放PtrL
,重复释放依然会导致其他错误)。