当前位置: 代码迷 >> C语言 >> 这个程序竟有固定输出值,为什么?
  详细解决方案

这个程序竟有固定输出值,为什么?

热度:170   发布时间:2007-07-30 23:54:09.0
这个程序竟有固定输出值,为什么?

这程序竟然对了,答案是: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);
}
}

搜索更多相关的解决方案: 输出  

----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
以下是引用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 …………

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



----------------解决方案--------------------------------------------------------
以下是引用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 …………

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


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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------


#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的空间


----------------解决方案--------------------------------------------------------
void(int *m,int *n)???
int i=0;
static j=0;???
在你的程序正确的这种情况下赋给了0,i,j

----------------解决方案--------------------------------------------------------

#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


----------------解决方案--------------------------------------------------------

谢谢,懂了!


----------------解决方案--------------------------------------------------------
  相关解决方案