码迷,mamicode.com
首页 > 其他好文 > 详细

6、跨函数使用内存

时间:2020-04-06 15:42:24      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:div   地址   sizeof   std   释放   class   函数   系统   bsp   

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

 

6、跨函数使用内存

标签:div   地址   sizeof   std   释放   class   函数   系统   bsp   

原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!