函数返回指针的问题

lingkeylbh 2007-03-06 12:33:05
#include <stdio.h>
#include <stdlib.h>
char* getz();
int main()

{
char *p;
p=getz();
//cout<<endl;
//cout<<p;
printf("%c\n",*(p+8));//ok
printf("%s\n",p);//wrong
system("PAUSE");
return 0;

}

char* getz()
{
char s[10];
char *ps;
int i;
ps=s;
for (i=0; i<10;i++)
{
s[i]=i+'0';
}

return ps;
}
根据网上搜出来的说话是char s[10];不是static所以返回后释放掉了,所以printf("%s\n",p);//wrong,可是为什么printf("%c\n",*(p+8));//ok
...全文
580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
麦田之兔 2007-03-08
  • 打赏
  • 举报
回复
不知道 楼主说得什么意思?
s[11]="\0"这句吗?是故意加的,不加也可以,不过声明数组要多声明一个用来放'\0'
WingForce 2007-03-06
  • 打赏
  • 举报
回复

printf("%s\n",p);//wrong的原因是因为getz中构造的字符串没有结束符'\0',而不是char s[10]被释放了
printf("%c\n",*(p+8));//ok只打印一个字符,当然没有问题。

以x86cpu为例,看局部变量对栈的增长的影响就知道了简单起见不考虑栈中存储的其他信息

==============低地址=============
int i;<---------------getz局部变量
char *ps;<------------getz局部变量
char* s[10];<---------getz局部变量
...<------------------调用机制需要保存的其他信息
char* p;<-------------main局部变量
==============高地址=============

当进入getz函数时,ESP指向了栈顶,int i;(可能还会有其他的一些原因ESP指向更低的地址)
而getz返回时,栈中的内容不会变化,只是将ESP指向调用getz前的地址,可能是char* p;
所以,其实char s[10];这时并没有变化,还是可以访问的。

可以修改成这样:
char* getz()
{
char s[11];
char *ps;
int i;
ps=s;
for (i=0; i<10;i++)
{
s[i]=i+'0';
}
s[10] ='\0';

return ps;
}

应该不会wrong了
lingkeylbh 2007-03-06
  • 打赏
  • 举报
回复
感觉楼上讲的有点道理,我刚看到一个新问题
在我那个程序里的return ps;之前加上printf("%s\n",ps);输出0-9;那个'\0'哪里来的啊
麦田之兔 2007-03-06
  • 打赏
  • 举报
回复
//我觉得楼主是错用指针,函数的值传递和引用传递,引用传递就是
//直接修改参数变量内容,楼主把指针用反了,指针指向的变量应该在main函数等
//调用的函数中,而楼主却把分配变量放到被调函数中,等函数返回后你的p=getz();
//得到了地址没错,可是因为被调函数一经返回,所有分配的变量就被释放。内容是不是
//会被改变很难说,即时你上面的程序正确运行、结果正确,这种设计也是错误的。
//应该把变量定义在主调函数中,然后用指针作参数,如下没有测试,大家看看是否正确。
//很少用C有些语法不一定对。
#include <stdio.h>
#include <stdlib.h>
void getz();//
int main()
{char *p;char s[11];
/*初始化s数组后调用函数getz*/
p=&s;
getz(p);
printf("%c\n",*(p+8));//ok
printf("%s\n",p);//wrong
system("PAUSE");
return 0;
}
void getz(char *s)
{int i;
for (i=0; i<10;i++)
{ s[i]=i+'0';
}
s[11] ='\0';
}
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
请注意 访问了非法的内存才会崩溃 .....
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
给我分吧 ^_^
iamcaicainiao 2007-03-06
  • 打赏
  • 举报
回复
printf("%c\n",*(p+2));//ok
printf("%c\n",*(p+3));//ok
printf("%c\n",*(p+4));//ok
printf("%c\n",*(p+5));//ok
printf("%c\n",*(p+6));//ok
printf("%c\n",*(p+7));//ok
printf("%c\n",*(p+8));//ok

ok? NO。
iamcaicainiao 2007-03-06
  • 打赏
  • 举报
回复
printf("%c\n",*(p+8));
同样道理,也是错误的。

只不过,有的时候,曾经的栈中的存放变量的那块内存还没被清洗掉。或许还可以访问而已。
iamcaicainiao 2007-03-06
  • 打赏
  • 举报
回复
同样可能会错掉。

函数中的变量,放在栈上。离了函数,那函数中的变量就不好再访问了

69,374

社区成员

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

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