1、静态变量不能跨函数使用内存
/*
此代码是错误的,目的是为了演示静态变量不能跨函数使用
静态内存由系统分配,当函数执行完毕由系统自动释放
*/
# include <stdio.h>
# include <stdlib.h>
void f(int ** q)
{
/*q是指针变量,无论是什么类型的指针变量都只占4个字节
q=&p。q存放了p的地址
q存放的是int *类型的变量地址,q变量的类型是int **,*q的类型是int *。
p存放的是int类型的变量地址,p变量的类型是int *,*P的类型是int。
*q等价于p, p可以存放int类型变量的地址
*/
int i=5;
*q=&i;//等价于p=&i
}
int main (void )
{
int * p;
f(&p);
/* f函数中的q变量和i变量的空间都是由系统分配的静态内存空间
属于静态变量,当f函数执行完毕后,系统自动释放
q和i所占用的内存空间,所以下面一行语句将无法访问
其数据。
*/
printf("%d", *p);//本语句语法上没有问题,但逻辑上有问题
system("pause");
return 0;
}
2、动态内存可以跨函数使用内存
/*
动态内存由程序员手动分配,手动释放
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void f(int ** q)//q存放int *类型变量的地址
{
//sizeof(数据类型)返回的是该数据类型所占的字节数。
//此处最好不要写成4,因为不同的机器它的数据类型所占的字节数有可能不相同
*q=(int *) malloc(sizeof(int));//等价于p=(int *) malloc(sizeof(int));
//q=5;//error
//*q=5;//error p=5
**q=5;//*p=5
}
int main(void)
{
int * p;//p存放int *类型变量的地址
f(&p);
printf("%d\n",*p);
system("pause");
return 0;
}