首页 > 其他 > 详细

堆的申请和释放2

时间:2016-03-02 23:42:03      阅读:193      评论:0      收藏:0      [点我收藏+]

技术分享

我们说过,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

原文:http://www.cnblogs.com/letben/p/5236688.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!