就是想知道,为什么是这样的输出???

zcphoenix 2008-04-14 09:40:50
#include <stdio.h>

int* fun()
{
int a[3]={1,2,3};
int (*p)[3] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
}

void fun2(int* pInt) //调用函数定义
{
for(int i=0; i<3; i++)
{
printf("%d\n",*(pInt + i));
}
}
void main()
{
fun2(fun());
}
上面的代码为什么输出是:
-858993460
1
1310592

在线等!谢谢!
...全文
117 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcphoenix 2008-04-15
  • 打赏
  • 举报
回复
虽然还不是很懂,有机会自己去研究编译原理吧!
谢谢!
baihacker 2008-04-14
  • 打赏
  • 举报
回复


//这个好理解一些
//把*p理解为指向当前函数栈上的第4个变量的指针(从变量开始分配的地方第4Byte看作一个变量,所以a在这里认为是4个)
//a中有4个元素,a可以转为第向fun上第4个变量的指针
//这里用4的原因是不必去理会因为变量对齐带来的问题
//两个函数都有一个参数是保证了相同的上下文
#include <stdio.h>

int* fun(int k)
{
int a[4]={1,2,3,4};
int (*p)[4] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
}

void fun2(int* pInt) //调用函数定义
{
int a[4]={5,6,7,8};
for(int i=0; i <3; i++)
{
printf("%d\n",*(pInt + i));
}
}


void main()
{
fun2(fun(1));
}

zcphoenix 2008-04-14
  • 打赏
  • 举报
回复
楼上的代码输出的确是678,可不可以解释下为什么?实在搞不懂啊!非常感谢!
baihacker 2008-04-14
  • 打赏
  • 举报
回复
假设调用fun的时候变量分配地址是X
那么由于fun2多一个参数,于是分配地址是X-4
如果fun的返回值是B,为fun的第m+1个变量(每个变量4Byte)
那么在调用fun2的时候也应该是B,为fun2的第m个变量

//下面的理论结果为678
#include <stdio.h>

int* fun()
{
int a[4]={1,2,3,4};
int (*p)[4] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
}

void fun2(int* pInt) //调用函数定义
{
int a[4]={5,6,7,8};
for(int i=0; i <3; i++)
{
printf("%d\n",*(pInt + i));
}
}


void main()
{
fun2(fun());
}
billy1985 2008-04-14
  • 打赏
  • 举报
回复
当返回值为指针变量时,得注意下该变量是否是栈内存中的变量。
我机器上输出的是
-858993460
1
1245056
楼主具体可以单步调试下 看看内存中变量的变化情况
注意栈是后进先出的

effective_person 2008-04-14
  • 打赏
  • 举报
回复
return *p
*p指向的是 a的首地址。
所先要知道在函数调用过程中, 函数中的变量都是局部变量(除引用变量)它的生存周期都只在该函数内。
但这个函数调用完时候,return 时这时局部变量已经释放了,在这个函数内就 没有什么a的数组了。
那么*p就指向不明的对象,此时再放回的就是错误的。
zcphoenix 2008-04-14
  • 打赏
  • 举报
回复
谢谢楼上各位的回帖,我知道代码中的错误,我只是想知道为什么是那样的输出?
lunarfan 2008-04-14
  • 打赏
  • 举报
回复
学习
zcphoenix 2008-04-14
  • 打赏
  • 举报
回复
楼上,那么输出结果中的“1”是不是碰巧的?其实三个输出都是随机数?
此外,有没有更好的方法呢?声明static的话,a数组就是一直存在的了啊(直至程序退出)!
谢谢!
effective_person 2008-04-14
  • 打赏
  • 举报
回复


int* fun()
{
static int a[3]={1,2,3}; //加个static 就好了,因为static的作用域就是 整个程序,一直到最后才释放掉的。
//好看看 书上的有关作用域的问题吧!

int (*p)[3] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)

//返回值有误! 返回局部变量的指针或引用是 大忌,因为在调用该函数完后,局部变量已经释放掉了。
//指像不明确的对象或引用不明确的对象肯地是错误的。

}


effective_person 2008-04-14
  • 打赏
  • 举报
回复

int* fun()
{
int a[3]={1,2,3};
int (*p)[3] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
//返回值有误! 返回局部变量的指针或引用是 大忌,因为在调用该函数完后,局部变量已经释放掉了。
//指像不明确的对象或引用不明确的对象肯地是错误的。

}
yzzlijun 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
C/C++ code
//因为你返回的是栈上的变量,函数返回时已经撤消了
//用成static就不在栈上,这就OK了
#include <stdio.h>

int* fun()
{
static int a[3]={1,2,3};
int (*p)[3] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
}

void fun2(int* pInt) //调用函数定义
{
for(int i=0; i <3; i++)
{
printf("%d…
[/Quote]
学习中

baihacker 2008-04-14
  • 打赏
  • 举报
回复

//因为你返回的是栈上的变量,函数返回时已经撤消了
//用成static就不在栈上,这就OK了
#include <stdio.h>

int* fun()
{
static int a[3]={1,2,3};
int (*p)[3] = &a; //定义一指向一维数组的指针,并初始化
return *p; //返回的为数组名(指向int型的指针)
}

void fun2(int* pInt) //调用函数定义
{
for(int i=0; i <3; i++)
{
printf("%d\n",*(pInt + i));
}
}
void main()
{
fun2(fun());
}
1
2
3
Press any key to continue

70,020

社区成员

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

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