码迷,mamicode.com
首页 > 其他好文 > 详细

堆的申请和释放2

时间:2016-03-02 23:43:45      阅读:220      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!