堆的申请和释放2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆的申请和释放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\n",p);
    free(p);

    char *s = NULL;
    func4(&s);
    printf("%s\n",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;
}

 

 

 

以上是关于堆的申请和释放2的主要内容,如果未能解决你的问题,请参考以下文章

面试题:堆和栈的区别

C++函数中,两个自动释放内存的动态内存申请类

堆的理解

栈和堆有什么不同之处

2020Java面试(更新中)

堆的分配和释放