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;
    }
  • 相关阅读:
    93. Restore IP Addresses
    mysql复制那点事(2)-binlog组提交源码分析和实现
    49. Group Anagrams
    43. Multiply Strings
    66. Plus One
    100. Same Tree
    MySQL 加锁处理分析
    mysql死锁问题分析
    数据库事务的四大特性以及事务的隔离级别
    MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html
Copyright © 2011-2022 走看看