| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 481 人关注过本帖
标题:这个程序竟有固定输出值,为什么?
只看楼主 加入收藏
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
结帖率:83.33%
收藏
 问题点数:0 回复次数:8 
这个程序竟有固定输出值,为什么?

这程序竟然对了,答案是:1:2,2
2:3,4
3:4,6

这个程序主函数中i,j没有赋值,而它的类型是auto,默认值是不确定的啊,因此&i,&j没指向确切的内存空间,在传参时它把什么传给形参了呀?

#include<stdio.h>
void(int *m,int *n)
{ int i=0;
static j=0;
*m=++i,*n=++j;
}
void main()
{ int i,j,k;
for(k=1;k<4;++k)
{f(&i,&j);
printf("%d:%d,%d\n",k,k+i,k+j);
}
}

搜索更多相关主题的帖子: 输出 
2007-07-30 23:54
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 

能者多劳,帮帮忙吧!急呢

2007-07-31 00:09
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用yqiong在2007-7-30 23:54:09的发言:

这程序竟然对了,答案是:1:2,2
2:3,4
3:4,6

这个程序主函数中i,j没有赋值,而它的类型是auto,默认值是不确定的啊,因此&i,&j没指向确切的内存空间,在传参时它把什么传给形参了呀?

#include<stdio.h>
void(int *m,int *n)
{ int i=0;
static j=0;
*m=++i,*n=++j;
}
void main()
{ int i,j,k;
for(k=1;k<4;++k)
{f(&i,&j);
printf("%d:%d,%d\n",k,k+i,k+j);
}
}




i,j是任意值 但不代表 &i,&j 是任意的 你想想 要是地址是任意的 你赋的值到哪里去?

其实就是

main:
push ebp
mov ebp,esp
sub esp,0ch
…………
lea eax,[ebp+8h]
push eax
lea eax,[ebp+4h]
push eax
call …………

我汇编烂 大概就这意思 呵呵


2007-07-31 01:00
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
以下是引用zklhp在2007-7-31 1:00:25的发言:


i,j是任意值 但不代表 &i,&j 是任意的 你想想 要是地址是任意的 你赋的值到哪里去?

其实就是

main:
push ebp
mov ebp,esp
sub esp,0ch
…………
lea eax,[ebp+8h]
push eax
lea eax,[ebp+4h]
push eax
call …………

我汇编烂 大概就这意思 呵呵


郁闷,没学过汇编呢,能不能用通俗点的语言啊,看不懂呢,呵呵

2007-07-31 18:36
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 

请各位高手帮帮忙,用通俗的语言解释一下,先谢谢了!

2007-08-01 22:21
wtyj112
Rank: 1
等 级:新手上路
帖 子:222
专家分:0
注 册:2007-5-9
收藏
得分:0 


#include<stdio.h>
void(int *m,int *n)
{ int i=0;
static j=0;
*m=++i,*n=++j;
}
void main()
{ int i,j,k;//这个时候已经给 i,j 分配了4个字节的内存空间。
for(k=1;k<4;++k)
{f(&i,&j);
printf("%d:%d,%d\n",k,k+i,k+j);
}
}

函数f 要求的参数是指针 啊 i j 已经有地址了 当然可以把他们的地址传给函数f。每次调用函数f时,临时分配 函数f中的局部i 并给它赋0,调用完毕后又取回该变量空间,但函数f中的j,是static j 这样这个j的地址就固定分配了,函数f调用完后不能取回该变量j的空间


计算机之路是痛苦并快乐着的!!
2007-08-01 22:56
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:0 
void(int *m,int *n)???
int i=0;
static j=0;???
在你的程序正确的这种情况下赋给了0,i,j

惟有学习不断的学习!
2007-08-01 23:03
wtyj112
Rank: 1
等 级:新手上路
帖 子:222
专家分:0
注 册:2007-5-9
收藏
得分:0 

#include<stdio.h>
int * f(int *m,int *n)
{
int i=0;
static j=0;
int *p = &i, *p1 = &j;
printf(" The ad of i in the f: %X\n", p); // 打印局部变量i的地址
printf(" The value of i int the f: %d \n", *p);// i的值
*m=++i,*n=++j;
return p;
}
void main()
{
int i,j,k;
int *p = &i;
int *p1 = &j;
int *p2;
printf("The ad of i and j in the main: %X %X \n", p, p1);//打印ij的地址。
for(k=1;k<4;++k)
{
p2 = f(&i,&j); //将f中的局部变量i的临时地址返还给p2。
printf("The value of i in the f when the f is over: %d \n", *p2);//打印 f中局部变量临时地址在调用完
//f后的值 。

printf("%d:%d,%d\n",k,k+i,k+j);
}

}

给你修改后的代码 你仔细看看局部变量i的变化 然后同样可以看j


计算机之路是痛苦并快乐着的!!
2007-08-01 23:16
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 

谢谢,懂了!

2007-08-02 00:17
快速回复:这个程序竟有固定输出值,为什么?
数据加载中...
 
   



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

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