热情软件屋

 

死循环怎么居然能正确输出


编号:QA001605
建立日期: 1999年8月26日 最后修改日期:1999年8月26日
所属类别:

阿庆:
    我有一条令人觉得可怕的C程序要请教你一下。
    编写一个函数print,在主函数输入数据,在print函数输出。
    struct student
    {int num;
     char name[8];
     int score[3];
     };
    print(struct student *p)
    {struct student *q=p;
    int c;
    printf("\nnum name 语文 数学 英语\n");
    for(;p<=p+3;p++) /*请注意这句*/
     printf("%-5d%-8s%-5d%-5d%-5d\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
    }
    main()
    {struct student stu[5];
    struct student *p;
    int i;
    printf("请输入学生数据:");
    printf("\nnum name 语文 数学 英语\n");
    for(i=0;i<=4;i++)
    scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].s
    core[2]);
    p=stu;
    print(p);
    }
    上面有注释的那一句循环本来应该是死循环,但在turboc2.0上运行后居然能正确输出,这是什么道理。

回答:

    按道理你的程序是错误的,但之所以可以运行跟TC的内存分配有关。因为TC从内存段的高端开始分配变量,所以stu[5]分配在段的高端。随着指针p的增加,p逐渐达到段的边缘,一旦p+3超过了段的64K限制,这样p    for(;p<=p+3;p++) /*请注意这句*/
    {
     printf("%p, %p\n", p, p+ 3); printf("%-5d%-8s%-5d%-5d%-5d\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
    }
     printf("%p, %p\n", p, p+ 3);
    }

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio