zoukankan      html  css  js  c++  java
  • C 语言 局部变量引用

    所谓静态内存分配,就是值我们并没有鲜明的指明内存分配,普通的变量的声明啦什么的,都需要内存,但是都是由系统自动分配的,所以叫静态内存分配。
    关键点: 函数内部的局部变量,在函数运行完销毁,之前指向它的指针变得不确定

    例如一段程序:

    include <stdio.h>

    void swipe(int** p){

    int temp = 999;
    
    *p = &temp;
    

    }

    void main(){
    int i = 100;
    int p = &i;
    swipe(&p);
    printf("
    p的:%d ",p);
    printf("
    p的:%d ",p);
    printf("
    p的:%d ",*p);
    }
    运行结果:

    *p的:999
    *p的:0
    *p的:0
    可以看出,我们的值已经交换成功了,但是为什么继续打印的时候就变成了0?

    那是因为这个时候 temp 这个变量的内存地址被回收了。所以指针main方法中的指针变量p所存储的内存地址中的值,已经不是当初赋值的999了,已经不知道被谁征用了。

    这就是所谓的静态内存分配,也就是内存的分配与回收都是由系统自动操作的。而在方法里面定义的变量,生命周期只在方法里面,所以temp变量的值只在swipe方法里面生效。方法运行完就该回收了。那么为什么我们会在方法运行完,第一条打印语句的时候,值还存在,不是被回收了吗?这个可以叫做内存残影吧,也就是说方法运行完里面的变量内存会被回收,但也是需要时间的,所以,第一条语句打印出来,只是刚好赶上了这个值没有被回收而已,不行,我们让程序延迟一下,看看第一条语句还能打印出来吗?

    include <stdio.h>

    include<stdlib.h>

    void swipe(int** p){

    int temp = 999;
    
    *p = &temp;
    

    }

    void main(){
    int i = 100;
    int p = &i;
    swipe(&p);
    Sleep(10);
    printf("
    p的:%d ",p);
    printf("
    p的:%d ",p);
    printf("
    p的:%d ",*p);
    }
    我们让程序延迟个10毫秒看结果:

    *p的:0
    *p的:0
    *p的:0
    可以看出来,内存中的值已经被回收了。

  • 相关阅读:
    java之JDBC
    git删除未监视的文件
    java之正则表达式
    linux命令之信息显示与搜索文件命令
    linux命令之文件备份与压缩命令
    gitlab中修改项目名称客户端修改方法
    linux中使用unzip命令中文乱码解决办法
    使用Python进行统计量描述
    Machine Learning
    Courase Neural Networks for Machine Learning Lecture1 Note
  • 原文地址:https://www.cnblogs.com/wdmx/p/9530050.html
Copyright © 2011-2022 走看看