• 堆的申请和释放2


    我们说过,buf 是栈区中的一个内容。

    func1被调用。

    执行Char buf[10]="nihao";的时候。

    Buf进栈,并被赋值。

    当程序结束的时候返回了一个指向buf的地址。的同时buf出栈,里面的内容可能还在,也可能不在。但是给p的地址确实是,当初分配给他的地址。只不过现在指向了新的内容。导致我们看到了这样一个显示结果。

    /*

    这是因为p指向的地址在那一瞬间,交付给其他程序,其他程序完成改写。再次释放了此处地址,又被p指向。

    有两个否则:

    第一个否则发生在,如果没有交给其他程序的话,这个值应该还是nihao

    第二个否则发生在,如果其他程序没有释放的话,程序会中断,访问了一个已经被使用的地址,我们知道如果使用了别的程序的地址的话,属于非法访问。操作系统会直接掐断我们的程序。

     

    这段解释很坑爹,求高玩斧正。

    */

    #include <stdio.h>
    
    char *func1(void);
    char *func2(void);
    char *func3(void);
    void func4(char **p); 
    void func5(char **p);
    int main(){
        //char *p = func1();
        //char *p = func2();
        char *p = func3();
        printf("%s
    ",p);
        free(p);
    
        char *s = NULL;
        func4(&s);
        printf("%s
    ",s);
        free(s);
        
        char *p5 = NULL;
        func5(&p5);
        strcpy(p5, "lifei");
        printf(p5);
        free(p5);
    
    
        getchar();
        return 0;
    
    
    }
    
    void func5(char **p){
        *p = malloc(sizeof(char)* 10);
    
    
    }
    
    void func4(char **p){
        *p = malloc(sizeof(int)* 10);
        strcpy(*p, "letben");
    
    }
    /** 
        正确返回一个新建立的字符数组对象:使用堆
    */
    char *func3(void){
    
        char *p = malloc(sizeof(char)* 10);
        strcpy(p, "你好");
        return p;
    
    }
    /** 
        对于这个函数来说,他是可以返回值的。因为hello是一个字符串儿常量,所以是可以返回的。
    */
    char *func2(void){
        return "hello";
    }
    char *func1(void){
        char buf[10] = "nihao";
        return buf;
    }

     

     

  • 相关阅读:
    Beyond Compare保存快照和CRC比较相结合的方法
    如何在Beyond Compare文本比较时设置书签
    如何使用Navicat for SQLite 触发器
    Navicat Premium 中实用工具介绍
    Beyond Compare查看合并文本后相同内容的方法
    Marriage Match II HDU
    Escape HDU
    kebab HDU
    Task Schedule HDU
    网络流深入
  • 原文地址:https://www.cnblogs.com/letben/p/5236688.html
Copyright © 2020-2023  润新知