• 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
    ", *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
    ", *p);// 5
        
        return 0;
    }
  • 相关阅读:
    情报分析技术领域主要研究人员
    《Dynamic Topic Detection and Tracking: A Comparison of HDP, C-Word, and Cocitation Methods》笔记
    Adobe Acrobat 9 Pro 注册码
    文件访问被拒绝 需要管理员权限
    批量文件重命名工具-极力推荐 advanced renamer
    Discuz登录慢、退出也慢的原因?
    一些需要阅读的论文
    webview上传图片
    自定义圆形图片
    touch ImageView
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html
Copyright © 2020-2023  润新知