跨函数使用内存

来源:互联网 发布:乐视如何查看mac码 编辑:程序博客网 时间:2024/05/01 23:22

首先要说的是,只有动态分配的内存可以跨函数使用,静态分配的内存是不可以跨函数使用的


下面举个例子(静态变量不能跨函数使用)

例1:

# include <stdio.h>void f(int ** q) //3行 {int i = 5;*q = &i;  // 6行 }int main(void){int *p;  //11行f(&p);  //13行printf("%d\n", *p);  //14行 return 0;}

输出结果为:


在第3行,q是个指针变量,无论q是什么类型的指针变量,都只占4个字节,

在f函数中,*q等价于p  q和**q都不等价于p

*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的

第6行的语句等价于p = &i;


至于第14行语句,语法虽然没有问题,但逻辑上有问题,因为*p本身等价于i,而i属于f函数,所以在13行f函数被调用后,其所占有的内存被释放了,此时i已经不存在了,当然,p仍可以保存i的地址,但p不能访问i的空间,但最终还是输出了这个值5,所以说这个语句语法虽然没有问题,但逻辑上有问题。

下边两个是在VS2005和gcc下的情况,结果该程序都通过了编译

VS2005下——


gcc下——


下面举一个动态内存跨函数使用内存的例子

例2:

# include <stdio.h># include <malloc.h>void f(int ** q){*q = (int *)malloc(sizeof(int));  //6行**q = 5;}int main(void){int * p;f(&p);printf("%d\n", *p);return 0;}

输出结果为:


第6行,*q也等价于p

而这一行的  sizeof(数据类型) 表示 返回值是该数据类型所占的字节数


【所有代码均在windows系统下VC++6.0下运行通过】

(如有错误,敬请指正)

0 0