关于C语言指针释放的问题
假如我有个int型变量A设置了一个int型指针B指向A然后我free掉B,这时候A被释放了对吗?但是我在此有个疑问,变量名实际上是内存地址的代称,指针B也是存放在另一个位...
假如我有个int 型变量 A
设置了一个int型指针B指向A
然后我free掉B,这时候A被释放了对吗?
但是我在此有个疑问,变量名实际上是内存地址的代称,指针B也是存放在另一个位置的内存地址,这个地址指向A,那么我free掉B应该是释放了B这个指针变量,即回到之前只有变量名指向该地址的情况,为什么会导致A所在地址被释放呢?还是说对于指针变量的释放会产生连锁反应不仅释放本身也释放本身所指向的地址?那么如果是指向指针的指针呢?是不是会一路释放下去? 展开
设置了一个int型指针B指向A
然后我free掉B,这时候A被释放了对吗?
但是我在此有个疑问,变量名实际上是内存地址的代称,指针B也是存放在另一个位置的内存地址,这个地址指向A,那么我free掉B应该是释放了B这个指针变量,即回到之前只有变量名指向该地址的情况,为什么会导致A所在地址被释放呢?还是说对于指针变量的释放会产生连锁反应不仅释放本身也释放本身所指向的地址?那么如果是指向指针的指针呢?是不是会一路释放下去? 展开
1个回答
展开全部
这段话中有好几个错误。
1. 如果有int A, int *B = &A, 这时执行free(B) 一定引起内存错误。
free只能使用在动态分配的内存上,不能用在堆栈或静态数据上。
类似 int A,或 static int A,这样的变量定义,是在编译时已经确定了内存位置。
动态分配是在运行时,从堆中临时分配的内存块(用malloc,或new)。这些内存块需要用 free(malloc)或delete(new)释放;
2. 变量名实际是内存地址的代称,这句也不完全对
在程序中,变量名代表了“这个地址上的数值”,只有对变量使用&操作,才能得到变量的地址
3. free(B)应该释放了B这个指针变量
如果指针变量存放了一个动态得到的地址,free(B)释放的是变量B的数值(不是变量B的地址),由于变量B的数值是一个动态分配得到的地址,所以free释放的是动态地址。
1. 如果有int A, int *B = &A, 这时执行free(B) 一定引起内存错误。
free只能使用在动态分配的内存上,不能用在堆栈或静态数据上。
类似 int A,或 static int A,这样的变量定义,是在编译时已经确定了内存位置。
动态分配是在运行时,从堆中临时分配的内存块(用malloc,或new)。这些内存块需要用 free(malloc)或delete(new)释放;
2. 变量名实际是内存地址的代称,这句也不完全对
在程序中,变量名代表了“这个地址上的数值”,只有对变量使用&操作,才能得到变量的地址
3. free(B)应该释放了B这个指针变量
如果指针变量存放了一个动态得到的地址,free(B)释放的是变量B的数值(不是变量B的地址),由于变量B的数值是一个动态分配得到的地址,所以free释放的是动态地址。
追问
我终于知道那内存错误是哪里来的了,原来用int A这样的形式声明的变量不能free……
好吧,那问题还剩最后一条,free(B)free掉的是数值,那B本身所占的内存呢?自从声明指针变量以来就固定在那里不动了对吗?
追答
指针变量B和整型变量A都是在编译时确定地址的变量,在程序结束时自动收回,无需人工释放。
指针变量B中放的内容是地址,整型变量A种放的内容是整数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询