1、静态变量不能跨函数使用(重点)
/*---------------------------------------------------------------------------------------- 静态变量不能跨函数使用 ------------------------------------------------------------------------------------------ 指针变量地址只能是**类型,这里q存放的是指针变量p的地址,那么*q就是p,把i的地址发 送给*q就等于把i的地址发送给p,既然p是i的地址那么*p就是i,所以*p=5。 但这个程序是错误的:q和i是静态分配的,f终止之后,为f分配的静态变量的空间会被释放, 当执行16行的时候f函数已经终止,p指向的变量i也不存在了,也就是p指向的i变量的访问权 限返回给操作系统了,不能再被使用了(此时p还能保存i的地址),也就不能读出i变量的内容。 -------------------------------------------------------------------------------------------*/ # include <stdio.h> void f(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节 { int i = 5; //*q等价于p q和**q都不等价于p //*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的 *q = &i; // p = &i; } int main(void) { int *p; //13行 f(&p); printf("%d\n", *p); //16行 本语句语法没有问题,但逻辑上有问题 return 0; }
2、动态内存可以跨函数使用(重点)
/*---------------------------------------------------------------------------------------- 动态内存可以跨函数使用 -------------------------------------------------------------------------------------------*/ # include <stdio.h> # include <malloc.h> void f(int ** q) { *q = (int *)malloc(sizeof(int)); //sizeof(数据类型) 返回值是该数据类型所占的字节数 //等价于 p = (int *)malloc(sizeof(int)); //q = 5; //error //*q = 5; //p = 5; **q = 5; //*p = 5; } int main(void) { int * p; f(&p); printf("%d\n", *p);// 5 return 0; }
原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html
时间: 2024-10-21 13:06:54