| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2797 人关注过本帖
标题:C语言函数返回数组名
只看楼主 加入收藏
Cking
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-9-23
收藏
 问题点数:0 回复次数:4 
C语言函数返回数组名
#include <stdio.h>
char * fun()//子函数返回一个在其内部定义的一个数组名
{
char str[5];
for(int i=0;i<5;i++)
str[i]=65+i;

return str;
}

1:第一个main函数:
main()
{
char *p, a[5];
int i;

p=fun();//返回值数组名给指针P;

for(i=0;i<5;i++)
a[i]=*(p+i);//把指针P指的内容一一赋给数组a[];

for(i=0;i<5;i++)
printf("%c\n",a[i]);

return 0;
}

2:第一个main函数:
main()
{
char *p;
int i;

p=fun();//返回值数组名给指针P;

for(i=0;i<5;i++)
printf("%c\n",*(p+i));

return 0;
}

1的输出为:ABCDE;
2的输出为:AXXXX; X代表乱码

我认为子函数返回一个在其内部定义的数组名,应为数组名是常量,所以指针p可以得到这个数组的首地址。但是返回后,除了数组的第0个元素外,其他4个元素都应该消失。那为什么第1个main()还输出了所有元素?
那第个main()函数为什么输出值不一样啊?为什么都定义一个数组然后在把p的指向改变,就不会有乱码?
谢谢啊!

[此贴子已经被作者于2007-10-30 17:27:30编辑过]

搜索更多相关主题的帖子: C语言 函数 
2007-10-30 17:23
chmlqw
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-10-11
收藏
得分:0 

说错了.......

[此贴子已经被作者于2007-10-31 23:24:27编辑过]

2007-10-30 22:39
Cking
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-9-23
收藏
得分:0 
洗耳恭听!

2007-11-01 16:46
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 


总的说来这样返回是错误的,在fun函数中定义的数组他是属于局部变量,在fun函数调用结束之后他就会释放掉的
这个过程嘛就是函数调用时候的入栈和出栈

函数调用的时候会把相应的局部变量,参数等放入堆栈中,函数调用完了就释放了,释放就是说:“这块内存我不用了”,这时候原来保存在
这快内存上的东西是没变的

在第一个程序中,虽然现在
p=fun()
p所指的内存是非法的,但是内容还存在,这时候
for(i=0;i<5;i++)
a[i]=*(p+i);
把他赋值给了a,所以a也就可以直接打印初来了,在这期间,这快内存还没被用(万幸啊,呵呵)

在第二个程序中,是直接 printf("%c\n",*(p+i));

这时候printf也是有一个函数调用的过程,也会有出栈入栈的操作,刚好不幸把那快内存使用了,所以初来的就是乱码了哦

Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-11-01 17:38
Cking
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-9-23
收藏
得分:0 
非常感谢!由于数组名是常量指针所以数组的第一个元素没有变,还是A,栈里后面的空间被printf给占了,所以是乱码

[此贴子已经被作者于2007-11-2 23:40:02编辑过]



2007-11-02 14:04
快速回复:C语言函数返回数组名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012699 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved