c语言全局指针变量释放有关问题
c语言全局指针变量释放问题
C语言在子函数调用之后是要进行子函数中局部变量所占的内存进行释放的
全局变量在退出程序时释放
但是现在有个问题
如果全局变量是个指针,在子函数中重新赋值,那么子函数退出后,是否释放?
如下
int *i;
int aa(int b) //函数
{
int a[5],b[6];
i=&a[0];
return 5;
}
这个运行结束之后肯定是要释放b[6]所占的内存的,但是是否释放a[5]呢?
如果释放,那么i将来若在别的地方使用,则i所指的值可能会错误
菜鸟求教!
------解决方案--------------------
完全正确。aa返回之后,a的地址不再有效,使用i有可能出问题。这是一个常见的错误。有时候编译器会有警告的。
结论:不要在函数返回之后使用局部变量的地址。
------解决方案--------------------
a[5]也和其他局部变量一样,也是要释放的。
------解决方案--------------------
执行那个函数后,两点
i保存了a数组的地址,直到程序执行结束
但是a数组本身会在函数执行完成后释放自己的内存
------解决方案--------------------
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……

------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
C语言在子函数调用之后是要进行子函数中局部变量所占的内存进行释放的
全局变量在退出程序时释放
但是现在有个问题
如果全局变量是个指针,在子函数中重新赋值,那么子函数退出后,是否释放?
如下
int *i;
int aa(int b) //函数
{
int a[5],b[6];
i=&a[0];
return 5;
}
这个运行结束之后肯定是要释放b[6]所占的内存的,但是是否释放a[5]呢?
如果释放,那么i将来若在别的地方使用,则i所指的值可能会错误
菜鸟求教!
------解决方案--------------------
完全正确。aa返回之后,a的地址不再有效,使用i有可能出问题。这是一个常见的错误。有时候编译器会有警告的。
结论:不要在函数返回之后使用局部变量的地址。
------解决方案--------------------
a[5]也和其他局部变量一样,也是要释放的。
------解决方案--------------------
执行那个函数后,两点
i保存了a数组的地址,直到程序执行结束
但是a数组本身会在函数执行完成后释放自己的内存
------解决方案--------------------
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)