找回密码
 注册
查看: 680|回复: 6

请各位大虾看看这个程序的结果!

[复制链接]
发表于 2005-8-5 16:16:42 | 显示全部楼层 |阅读模式
void main()
{
   int a[3]={0,1,2};
    int *b;
    int i;
     int **c;
     b=a;
     c=&b;
     for(i=0;i<3;i++)
          printf("%d\n",c);
}

结果出来后很不懂,希望大家能给个正确的说法!
发表于 2005-8-5 16:58:17 | 显示全部楼层
当然不是0,1,2了,是一些地址吧?用 printf("%d\n",c[0]); 试试
回复

使用道具 举报

发表于 2005-8-5 17:23:43 | 显示全部楼层
[code:1]int main(){
        int a[3]={0,1,2};
        int *b;
        int i;
        int *c;
        b=a;
        c=b;
        for(i=0;i<3;i++){
                printf("%d\n",c[i]);
        }
        return (0);
}[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-8-5 20:13:55 | 显示全部楼层
不是呀!!结果是第一个数是一个溢出的地址,第二第三个数才分别是0,1!
然后我把i的范围确定为for(i=1;i<=3;i++),则结果是0,1,2!
这个程序我编译过很多次,结果都如上!!
请问大家着是什么原因了?
回复

使用道具 举报

发表于 2005-8-6 08:45:22 | 显示全部楼层
刚好这么分配了地址吧
回复

使用道具 举报

 楼主| 发表于 2005-8-6 10:14:03 | 显示全部楼层
刚好这么分配了地址吧

楼上请问这是什么意思呀??我最不明白的是c为什么会是a的值???
回复

使用道具 举报

发表于 2005-8-6 11:42:50 | 显示全部楼层
详细地给你分析一下吧:
你这种结果纯粹是巧合。
1、首先做一下分析
b = a
c = &b
c = *(c + i)
则c = *(&b + i)
当i = 0时,c[0] = *(&b) = b =a 所以第一个输出为数组的首地址。
当i = 1时,c[1] = *(&b + 1) 这时候为什么输出1?
在程序中打印a、&b的地址(我在DEV-C++下运行)
/**********************************************/
#include <stdio.h>


int main(void)
{
    int a[3]={0,1,2};
    int *b;
   
    int i;
    int **c;
   
    b=a;
    c=&b;
    for(i=0;i<3;i++)
    printf("c[%d] = %d\n", i, c);
   
    printf("a = %d\n", a);
    printf("&b = %d\n", &b);
   
    getch();
     return 0;
}
/**********************************************/
得到 c[0] = 2293600
        c[1] = 0
        c[2] = 1
           a =  2293600
          &b = 2293596
不知你看出道理来了没:函数中按局部变量的声明顺序降序分配栈空间(数组升序),所以 a的栈空间在b之上。
回到刚才的:当i = 1时,c[1] = *(&b + 1) 这时候为什么输出1?
c[1] = *(&b + 1) = *(2293596(地址常量) + 1*4) = *(2293600(地址常量)) = a[0] = 0
这里乘4是因为&b的类型是地址,32位机中地址占4字节。
这样当i = 2时,c[2] = *(&b + 2) = 2就很正常了。
也可以解释
“然后我把i的范围确定为for(i=1;i<=3;i++),则结果是0,1,2!”这个问题了。

2、为什么这个结果是巧合?就是因为刚好b的栈空间刚好在a之下差4各字节。
若改变
int a[3]={0,1,2};
    int *b;
的定义顺序为
    int *b;
int a[3]={0,1,2};
结果恐怕就不会出现1 ,2了

“然后我把i的范围确定为for(i=1;i<=3;i++),则结果是0,1,2!”这样只怕也不行哦!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-8 03:09 , Processed in 0.040743 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表