返回字符串问题.

saishow 2010-08-19 10:35:12
如果去掉puts(ch)返回就不对.是什么地方错了?我单步调试确实已经返回了字符串.但是在main()中puts(i)确实乱码.什么问题呢?

char *get_s(void);
int main(int argc, char * argv[])
{
char *i;
i = get_s();
puts(i);
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
char *get_s(void){
char ch[81];
gets(ch);
//puts(ch);
return ch;
}
...全文
263 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctest_ 2010-08-25
  • 打赏
  • 举报
回复
用NEW的字符串可以
wei832660 2010-08-24
  • 打赏
  • 举报
回复
在get_s(void)函数里,如果使用了局部变量(如:puts(ch),printf(ch)等),则系统对该变量有记录,否则主函数无法寻址到数组ch的位置
漫步者、 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 ganpengjin1 的回复:]
#include<stdio.h>
#include<stdlib.h>
char *get_s(void)
{
char *ch;
ch=(char*)malloc(sizeof(char)*81);
scanf("%s",ch);
return ch;
}
int main()
{
char *i;
i = get_s();
printf("%……
[/Quote]呵呵,忘了释放内存了,你自己再释放一下就行了!
漫步者、 2010-08-24
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
char *get_s(void)
{
char *ch;
ch=(char*)malloc(sizeof(char)*81);
scanf("%s",ch);
return ch;
}
int main()
{
char *i;
i = get_s();
printf("%s",i);
return 0;
}
这样也行,要弄清局部变量和全局变量的区别!
没有昵称阿 2010-08-24
  • 打赏
  • 举报
回复
支持一下!
漫步者、 2010-08-24
  • 打赏
  • 举报
回复
char ch[81];//这样就行了!
char *get_s(void);
int main()
{
char *i;
i = get_s();
puts(i);
return 0;
}
char *get_s(void)
{
gets(ch);
//puts(ch);
return ch;
}
skyfree 2010-08-24
  • 打赏
  • 举报
回复
初学者最容易犯的错误
ywh1008 2010-08-24
  • 打赏
  • 举报
回复
学习了
sky_pearl 2010-08-24
  • 打赏
  • 举报
回复
数组ch[81]在函数返回的时候就没了吧~所以即使记着ch这个指针也没啥用,整个数组都没了嘛 就没用了
不过LZ的意思是加了PUTS就有用?不明白……
bobo364 2010-08-24
  • 打赏
  • 举报
回复
结果不对啊,看来是局部变量返回的问题
#include<stdio.h>

char *get_s(void);

int main(int argc, char * argv[])
{
char *i;
i=get_s();
puts(i);
system("PAUSE");
return 0;
}


//---------------------------------------------------------------------------
char *get_s(void)
{
char ch[81];
gets(ch);
//puts(ch);
return ch;
}
zrebecca 2010-08-24
  • 打赏
  • 举报
回复
不要返回局部变量的指针
flyinbirdf 2010-08-20
  • 打赏
  • 举报
回复
这个高质量编程上的经典例子吧。栈上的东东,返回了,就被覆盖掉了。虽然指针还是那个指针。
yngaocn 2010-08-20
  • 打赏
  • 举报
回复
ch[]是函数get_s()函数内的局部变量,离开函数体后生命周期就结束了,内存被系统收回,不能再对其访问,即使得到地址访问的也是错误的数据。

解决:
1。要么把ch[]定义成全局变量,这样在main中也能访问
2。要么动态分配空间给char*型的ch,在main中打印后再free掉。
*********************************************************
1。全局变量

char *get_s(void);
char ch[81];//全局变量
int main(int argc, char * argv[])
{
char *i;
i = get_s();
puts(i);
system("PAUSE");
return 0;
}

char *get_s(void)
{
gets(ch);
return ch;
}

-----------------------------------
2。动态分配空间

char *get_s(void);
int main(int argc, char * argv[])
{
char *i;
i = get_s();
puts(i);
free(i);//使用完后释放内存
system("PAUSE");
return 0;
}

char *get_s(void)
{
char *ch=(char*)malloc(80);//动态分配内存
gets(ch);
return ch;
}
queatin_man 2010-08-20
  • 打赏
  • 举报
回复
呵呵,局部变量的问题
c4489128 2010-08-20
  • 打赏
  • 举报
回复
仔细研究下函数的调用过程,当你这个get函数调用结束后,局部变量ch也随之消失了。
mao_pu_hua 2010-08-20
  • 打赏
  • 举报
回复
ch 是自动存储变量。这个函数结束后,它的空间就没有了。也就是你输入的内容在内存中就已经没有了。
你再返回,当然是没有内容的嘛。

如果你真想这样做,大概有三种办法。
1。 就是把ch做出全局的。那么它就是静态的了。
2。 就是ch有malloc分配空间。这样的话,它也不会被回收掉
3。 就是把ch作为参数传进函数里面。然后再按照刚才的办法处理。
wenrui531 2010-08-20
  • 打赏
  • 举报
回复
如果在get_s函数中运行puts(ch);main函数也正确.是什么原因呢?


建议lz看看形参和实参相关的知识点
实参传递给形参全部采用值传递的方式,
函数对形参的修改结果不会带回到主调函数。

解决办法就是使用指针变量作形参,就可以通过地址的值传递实现指向变量的引用传递。
saishow 2010-08-20
  • 打赏
  • 举报
回复
如果在get_s函数中运行puts(ch);main函数也正确.是什么原因呢?
赵4老师 2010-08-19
  • 打赏
  • 举报
回复
static char ch[81];
saishow 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linux_qt 的回复:]
因为ch的生命周期就是get_s函数内
[/Quote]

如果在get_s函数中运行puts(ch);main函数也正确.是什么原因呢?
加载更多回复(12)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧