函数返回字符串首地址的问题

jiemo1123 2012-10-20 10:55:32

char * returnString()
{
char * pcTestStr;
char TestStr[] = "OKOK";

pcTestStr = TestStr;

return pcTestStr;
}
int main()
{
char * pcSrcStr;
char str[20];

pcSrcStr = str;

printf("%s\n",pcSrcStr);

return 0;
}

这样打印出来的为什么是乱码,而不是OKOK?
returnString()函数改为

char * returnString()
{
char * pcTestStr = "OKOK";

return pcTestStr;
}

这样打印出来的就是OKOK?求各位大神说明下,谢谢!
...全文
942 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfvmario 2012-10-22
  • 打赏
  • 举报
回复
比如你第一个程序,调用函数时TestStr=0x12345678
返回的值还是0x12345678,这没有问题,和返回3的道理一样
问题是0x12345678这个地址被释放了,里面指向的值可能已经被系统改写了
[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:

因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");


如果有一个函数
int a()
{
int b = 0;
b = 3;

retu……
[/Quote]
图灵狗 2012-10-22
  • 打赏
  • 举报
回复
你这种非指针的普通类型是不一样的,相当于是值拷贝后返回。

[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:

因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");


如果有一个函数
int a()
{
int b = 0;
b = 3;

retu……
[/Quote]
timetrue 2012-10-22
  • 打赏
  • 举报
回复
临时变量在函数返回时会失效
jiemo1123 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");

[/Quote]
如果有一个函数
int a()
{
int b = 0;
b = 3;

return b;
}
这样的b不是也是分配在栈的吗?为什么其他函数调用a()时,返回值是3?小弟初学者
EmberSpirit 2012-10-20
  • 打赏
  • 举报
回复
就行1楼说的那样,函数结束后,返回的指针成了野指针!
一般不要返回指向局部变量(栈上分配空间)的指针,因为栈区是系统管理的。改在堆上分配空间就可以了!
Joseph_1118 2012-10-20
  • 打赏
  • 举报
回复
char TestStr[] = "OKOK";
这个地方有两个"OKOK",一个是放在只读数据段,一个是栈上。
开始你返回的是栈上的数据,你用的应该是ms的编译器吧,所以返回的可能是乱码。
后面的你返回的是只读数据段的数据的指针,所以是一直在那没变的。
就这样。要不你反汇编看看。
glcs 2012-10-20
  • 打赏
  • 举报
回复
第一个出问题因为是因为那样写出来是局部变量,原因同2楼。第二个不出问题是因为字符串"OKOK"相当于是一个常量被编译在程序里面,也就是这个"OKOK"字符串的地址是全局有效的,虽然只在returnString函数中被引用到了。所以在returnString中返回的地址到main里面依然是有效的。
guolisen 2012-10-20
  • 打赏
  • 举报
回复
你第一个代码也没用到returnString啊。。。
图灵狗 2012-10-20
  • 打赏
  • 举报
回复
因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");

69,371

社区成员

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

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