函数返回值用char*,一个是return数组名,一个是return char*变量,但是前者不行,后者可以,为什么?

Mi_Bo 2004-10-28 11:54:03
看下面的程序 :
#include<iostream.h>
char* name()
{
char name[8]="windows";
return name;
}
void main()
{
cout<<name()<<endl;
}
但是这样就能够正常输出 :
#include<iostream.h>
char* name()
{
char *name="windows";
return name;
}
void main()
{
cout<<name()<<endl;
}
为什么,谢谢!!


...全文
1166 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqi162002 2004-10-28
  • 打赏
  • 举报
回复
总得来说就是:数组名可以隐式转到指针,而指针不能转到数组
qiqi162002 2004-10-28
  • 打赏
  • 举报
回复
数组名是数组名,指针是指针,数组名可以看做是数组第一个元素的指针:

char v[]="C++之父说的";
char *p=v; //隐式地从char[] 转换到char*
strlen(p); //原型strlen(char*)
strlen(v); ////隐式地从char[] 转换到char*
v=p /////////////////////错误:不能给数组赋值
///////上面是在C++ PROGRAMMING LANGUAGE 看的////////

我对上面的理解是:如果函数参数要传数组最好用指针定义参数
如:f(int *)这样int a[]={1,2}; f(a)是对的;

但如果定义成数组如:f(int[][]) 那么int **arr(通过NEW分配二维数组后);f(arr)就不行了,因为它将指针赋给数组,这是不行的,(数组名可以隐式到指针,但指针不能给数组)
////
这是我回答别人的答案贴出来,意思一样//就是说数组名与指针是不同的
zephyr741 2004-10-28
  • 打赏
  • 举报
回复
好像一个是数组一个是变量!
xuzheng318 2004-10-28
  • 打赏
  • 举报
回复
返回了临时的局部变量!
xuzheng318 2004-10-28
  • 打赏
  • 举报
回复
#include<iostream.h>
char* name()
{
static char name[8]="windows";
return name;
}
void main()
{
cout<<name()<<endl;
}


就ok了
dragonzxh 2004-10-28
  • 打赏
  • 举报
回复
#include<iostream.h>
char* name()
{
static char name[8]="windows";
return name;
}
编译通过。
njSeeWhy 2004-10-28
  • 打赏
  • 举报
回复
第一个函数里,name所占的内存是在栈上分配的,函数返回后name中的数据不再有效。而第二个函数中的name指向一个文字量,文字量所占的存储空间在程序结束时才会释放,所以函数返回后仍然有效。
ewayne 2004-10-28
  • 打赏
  • 举报
回复
前者返回的是字符数组的首地址,后者返回的才是字符串!
dragonzxh 2004-10-28
  • 打赏
  • 举报
回复
因为第一个中char name[8]是局部变量吧,所以不能返回
donrong 2004-10-28
  • 打赏
  • 举报
回复
看来又要讨论生命周期与作用域了 不过这个问题也的确有点麻烦 理解透了就OK了
donrong 2004-10-28
  • 打赏
  • 举报
回复
我在VC里面它给出的编译警告是:
returning address of local variable or temporary
yellowwolf 2004-10-28
  • 打赏
  • 举报
回复
zhangfjj(小张(生命不息,灌水不止。)) 回答的好。。。

问题核心在于"window" 存放到在哪里以及它的生命周期范围。
所以说
xuzheng318(forever C++) 和 dragonzxh(河马MiaMia) 用static 能够成功。
因为用了static后数组变量的生命周期范围就是全局的了。建议不要这样。 如果是一个大
程序,用多个static很大的数组的话,它们就会站着毛坑不拉屎。
yellowwolf 2004-10-28
  • 打赏
  • 举报
回复
qiqi162002(思想) 数组的地址是个常晕,而指针的指向的空间原本就是放地址的, 它是一个变量。
zhangfjj 2004-10-28
  • 打赏
  • 举报
回复
char* name()
{
char *name="windows";//忘记了一点,const常量,如字符串会放在全局数据区,它在程序运行期间都会存在,它不是一个局部对象的指针,而是一个全局对象的指针,所以返回它的地址没有关系。
return name;
}
zhangfjj 2004-10-28
  • 打赏
  • 举报
回复
不是返回局部变量(它当然可以返回呀)
int f()
{
int i=5;
return i;
}
不是行吗?
应该是返回局部变量的指针。
上面也有人说了,因为指针变量可以间接访问其他变量。
当函数调用结束,释放了局部变量,而这里返回它(局部变量)的指针,在其他函数(主调函数)可以访问已被释放的内存区域,这是很危险的,因为你不知道这个被释放的内存块会用作什么???
iming 2004-10-28
  • 打赏
  • 举报
回复
这个问题蛮经典的,我也遇到过,不过理解还不是很深刻。
liumiao 2004-10-28
  • 打赏
  • 举报
回复
agree with road1981(road)
xuzheng318 2004-10-28
  • 打赏
  • 举报
回复
不就是生命周期的意思嘛!
road1981 2004-10-28
  • 打赏
  • 举报
回复 1
晕,这么多人概念不清,这根本就不是什么指针和数组转换的问题。
正解来了:
char name[8]="windows";
是在栈中建立一个连续的数组.他的存在范围就是函数char();除了哪个函数,这个栈里的东西当然就不存在了。

char* name ="windows";
与上一句有本质的不同,他是建立一串static类型的字符串,在整个程序运行的时间内有存在,所以在函数以外显示了...

答完了,给分~!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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