看下这个程序

Start13 2007-12-11 03:27:53
看下这个程序输出什么吗?能给详细解释吗?

#include <stdio.h>

void foo(int p)
{
int *t;
t=&p;
t[-1]+=2;
}

int main(void)
{
int a=100;
foo(a);
a+=20;
printf("%d\n",a);
return 0;
}
...全文
206 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
power_115 2007-12-12
  • 打赏
  • 举报
回复
同意zyw2007 的
阿呆_ 2007-12-12
  • 打赏
  • 举报
回复
其实t[-1] += 2 修改的是foo函数运行后的返回地址,原来调用foo函数的返回地址应当是 a += 20这句指令在内存中的地址, 现在的返回地址多加了2, 是否出错就要看编译器是如何生成 a+=20;这一句了,有可能是跳过了这句, 不过最大可能是返回到了某条指令的半当中, 这样的结果就是后续所有指令全部不正确, 执行的最好结果是本程序出错崩溃。
l254671666 2007-12-11
  • 打赏
  • 举报
回复
未知区域内存不可预知
wwxxdd1982 2007-12-11
  • 打赏
  • 举报
回复
t[-1]+=2;

t[-1] 同义词 *(t-1)
此时指向t向前4个字节的值,
t[-1]+=2;就是向这个地址赋值
出错的原因是栈崩溃了

还是希望高手解释下到底是为什么崩溃的。

ziseyezi 2007-12-11
  • 打赏
  • 举报
回复
你传递的不是指针或数组类型,传递一个变量时形参并不变。
baiguang06 2007-12-11
  • 打赏
  • 举报
回复
t[-1]+=2;
谁写出来的?
t[-1] 这个地址是未知的,不知道会出现什么情况
changy 2007-12-11
  • 打赏
  • 举报
回复
mark
茻鄷 2007-12-11
  • 打赏
  • 举报
回复
t[-1]+=2有什么用啊?
zyw2007 2007-12-11
  • 打赏
  • 举报
回复
#include <stdio.h>

int foo(int p)
{
int *t;//&t 0x0013ff2c &p 0x0013ff2c
t=&p;
t[-1]+=2;// &t[-1] 0x0013ff28
return 0;
}

int main(void)
{
int a=100;//&a 0x0013ff7c
foo(a);
a+=20;
printf("%d\n",a);// a = 1310528
return 0;
}

不明白,&t[-1],&p,&a的地址并没指在同处啊,怎么最后使a的地址变了呢
skxq1983 2007-12-11
  • 打赏
  • 举报
回复
编译出错,t[-1]+=2导致多个指针指向同一直
NKLoveRene 2007-12-11
  • 打赏
  • 举报
回复
vc6出错
这个t[-1]+=2干嘛
baobaohechen 2007-12-11
  • 打赏
  • 举报
回复
同意zyw2007 的,VC里运行会弹出错误
zyw2007 2007-12-11
  • 打赏
  • 举报
回复
t[-1]+=2;
把栈破坏了
zyw2007 2007-12-11
  • 打赏
  • 举报
回复
输出是个不确定的数,a的地址变了,用vc6试的,
Treazy 2007-12-11
  • 打赏
  • 举报
回复
输出还是100
语句a+=20;被foo函数冲掉!
babyvox1999 2007-12-11
  • 打赏
  • 举报
回复
120
rainharder 2007-12-11
  • 打赏
  • 举报
回复
没看foo函数,可以看看函数调用的栈空间,没仔细研究过
rainharder 2007-12-11
  • 打赏
  • 举报
回复
120
传给foo的参数是a的拷贝,并没有改变a的值

70,026

社区成员

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

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