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