| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2748 人关注过本帖
标题:问个关于函数返回数组指针的问题
只看楼主 加入收藏
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
结帖率:86.67%
收藏
 问题点数:0 回复次数:7 
问个关于函数返回数组指针的问题
程序代码:
#include<stdio.h>
int * tain()
{
    int x[2]={1,2};
    //a=x;
   return x;
}

main()
{
    int *a;
    a=tain();
    printf("%d",a[1]);
}


如上代码所示,函数中建立了数组,在函数调用完之后这个数组应该是“消失”了的,为什么在最后a[1]输出的是2啊?难道那个在函数中建立的数组还存在着???
搜索更多相关主题的帖子: 函数 指针 
2010-03-02 19:03
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
分编译器的,这个结果应该是不确定的.
2010-03-02 19:43
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
这样啊,呵呵,还真麻烦啊!谢谢!
2010-03-02 20:45
mylzy159
Rank: 2
等 级:论坛游民
帖 子:61
专家分:23
注 册:2009-4-12
收藏
得分:0 
指针指向数组首地址..可以用指针数组表示出来.
2010-03-02 20:58
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
建立无返回值void 你试一下

Discuz!  
好好学习  天天向上
2010-03-02 23:22
鼻涕流流
Rank: 1
等 级:新手上路
帖 子:7
专家分:1
注 册:2010-3-4
收藏
得分:0 

一般来说,函数建立的局部变量数组是放在函数调用栈中的,函数调用完之后栈被摧毁,局部变量和数组也应该消失。
但是有的编译器的实现,将完全初始化了的数组存放在了数据区而不是在栈上,因此那个数组存在是可能的。

一般来说,C语言在4G的虚拟空间中建立这样的数据存放结构:

           
           
           未初始化数据段(BSS段)
           数据段(貌似可以修改,存放全局变量之类的)
           只读数据段(存放字符串等等,不可修改)
           代码段(存放函数也就是方法代码咯)

根据楼主的演示结果,那个数组很可能放在数据段中。因此指针还能访问到正确的数据。不然理论上是不可能的,tain栈被摧毁后立即被printf函数栈占据,因此一般不会得到正确的结果。
2010-03-04 21:09
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
因为你的局部变量是存储在栈中的,函数结束返回的时候,栈顶会下移,在x86的表现是ebp和esp被回复成调用前的值,而对调用函数之前在栈中的内存内容并不做修改,这时你从函数中返回的指针指向的内存没有任何变化,所以你直接访问的时候还会得到那个值(这里很可能是prinft使用栈是没有增长到a[1]指向的地址),如果你在函数返回后立即调用另一个函数,那么该指针地址指向的地方可能被改变,这是该位置的值就未定了。
例如:
#include<stdio.h>
int * tain()
{
    int x[2]={1,2};
    //a=x;
   return x;
}

int * tain1()
{
    int x[2]={1,3};
    //a=x;
   return x;
}

main()
{
    int *a;
    a=tain();
    tain1();
    printf("%d",a[1]);
}

这是输入的应该不会是2了,应该会是3


[ 本帖最后由 zhddragon 于 2010-3-4 21:40 编辑 ]

身体是玩命的本钱
2010-03-04 21:33
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
7楼的应该很全面

Discuz!  
好好学习  天天向上
2010-03-04 22:25
快速回复:问个关于函数返回数组指针的问题
数据加载中...
 
   



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

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