#include <stdio.h>
#include <string.h>
char *RetMemory(void)
{
char p[]="hello world";
return p;
}
void test(void)
{
char *str=NULL;
str=RetMemory();
printf(str);
}
void main()
{
test();
}
答案是不能输出正确结果,但是为什么不能输出正确结果啊,怎么修改才能出现正确结果呢?
怎么修改才能出现正确结果呢
不能得到正确结果的原因是因为 p 是定义在栈上的局部变量,
当函数结束时,p所占内存空间会被释放,此时p指向未知区域,因此不能得到正确的结果。
楼主还没看到malloc,最简单可行的修改方法是:
static char p[]="hello world"; //加上static修饰符,p为静态变量,其生存期为定义处到程序结束。
关于如何返回函数的局部变量,强烈推荐这篇博客,讲得很详细。
博客中也讲了malloc的用法。
http://blog.csdn.net/jackystudio/article/details/11523353
如果对您有帮助,请采纳答案好吗,谢谢!
输出应该是printf("%s",str);吧
输出应该是 *str , str是指针地址
p是一个指针,是指向“hello world”藏身之地的一个指引,RetMemory()返回的是p,str又是一个指针,他指向了p指针的“藏身之地”,得到的不是hello world。不知道这样讲对不对,能不能理解。
楼上有位说的很对的
char p[]="hello world";
这个函数里的以上变量 执行完就被销毁了 所以说其实你返回的是一个莫名其表的指针
你想修改可以传递参数 可以声明全局变量
别在返回一个你在函数里声明的变量 那个变量其实在函数执行完以后就不存在了
你不觉得打开电脑dev试一下比在这里问更快吗?学会自己动手找答案。
其实一楼有点脱裤子放屁了,他这样malloc,没有free掉内存容易造成内存泄漏,简单说就是分配内存但是没有收回,导致可分配的内存减少。但是有一部分说的是对的
,就是char p[]="hello world"是在栈内存上分配的内存空间,函数执行完后内存就销毁了。但是也没必要用malloc去在堆上分配空间,其实char * p ="hello world";就可以了,因为“hello world"
是一个字符串,会分配在常量区,这个区域的值在函数执行结束后是不会销毁的,一定程度上和全局变量一样。而p里面的地址就是这个不会销毁的常量区的地址,所以直接返回这个p就可以了,不知道这么说你明白不,还有一点就是需要在栈区分配个空间留给p这个变量去存放地址,函数结束后分派给p的内存会销毁,但是p内的地址已经返回了,也就是字符串的地址。