zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html
Copyright © 2011-2022 走看看