6、跨函数使用内存

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;
}

 

posted @ 2020-04-06 14:04  zh_小猿  阅读(144)  评论(0编辑  收藏  举报