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
    可以看出来,内存中的值已经被回收了。

  • 相关阅读:
    CTF-域渗透--SSH服务
    CTF-域渗透--SMB信息泄露
    CTF-域渗透--FTP服务后门利用
    Codeforces Round #628 (Div. 2)
    模板
    模板
    Educational Codeforces Round 6
    Educational Codeforces Round 5
    模板
    Codeforces Round #627 (Div. 3)
  • 原文地址:https://www.cnblogs.com/wdmx/p/9530050.html
Copyright © 2011-2022 走看看