C语言字符数组输出问题

char*get_str(){charstr[]={"hello"};returnstr;}intmain(intargc,char*argv[]){char*p=get... char* get_str()
{
char str[]={"hello"};
return str;
}
int main(int argc, char *argv[])
{
char *p=get_str();
int i=0;
int len=strlen(p);
while(i<len)
{
printf("%c",p[i]);
i++;
}

return 0;
}
为什么输出的总是乱码?谁能告诉我为什么!
展开
 我来答
松甜恬0Je4ba
2014-03-14 · TA获得超过2.6万个赞
知道大有可为答主
回答量:7475
采纳率:100%
帮助的人:3463万
展开全部
char str[]

因为这个是局部变量,函数执行完后,这部分内存就被收回了,里面存放的东西不可预料。

char* get_str()
{
char str[]={"hello"};
return str;
}

修改为

char* get_str()
{
char *str;
str = (char *)malloc(10*sizeof(char));
strcpy(str,"hello");
return str;
}

头文件 malloc.h
更多追问追答
追问
如果是这样:
char* get_sty()
{
char* sty={"hello"};
return sty;
}

int main()
{
char *q=get_sty();
pintf("%s \n",q);

return 0;
}
为什么同样是局部变量sty就能正常输出了呢?和上面的str[]有什么区别啊?(后天就要去面试了)
追答
如果不加[]就是常量,不是变量了,在内存中存放的位置不同,

1)栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存
储区.里面的变量通常是局部变量,函数参数等.
2)堆,又叫自由存储区,它是在程序执行的过程中动态分配的,它最大的特性就是动.
态性.由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,
一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,
操作系统会自动回收.如果分配了堆对象,却忘记了释放,就会产生内存泄漏.而
如果已释放了对象,却没有将相应的指针置为NULL,该指针就是"悬挂指针".
4)静态存储区.所有的静态对象,全局对象都于静态存储区分配.
5)常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
百度网友56c306f
2014-03-14
知道答主
回答量:9
采纳率:0%
帮助的人:7.4万
展开全部
在get_str()中定义的数组暂存在栈中,返回主函数后临时变量存储的地址回收,也就是str指向地址里的数据已经改变了
追问
明白了,还是自己基础掌握的不扎实!谢谢你!不过分只能给楼上那位了....
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
逍遥一仔仔
2014-03-14 · 超过51用户采纳过TA的回答
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:76.2万
展开全部
你这程序写的很成问题啊!~
追问
hehe
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式