C_易水寒

海角C语言,被遗忘的凄美故事!剜骨放血,只有最深痛的记忆留在中枢神经!

导航

我发现的VC++6.0的两个错误!

我最近在研究sizeof这个关键字,我发现了VC++6.0的两个错误!!

编译器也会出现错误,很正常!

首先分析VC++6.0软件的第一个错误,用sizeof测试数组时发现的。

看代码分析吧:

void main()

{

      

/*    int *p=NULL;

       int i=0,j=0;

       i=sizeof(p);

       printf("%d\n",i);

       j=sizeof(*p);

       printf("%d\n",j);

*/

int a[100];

       int i,j,k,l,m,n;

       i=sizeof(a);          //调试后:i的值为400

       j=sizeof(a[99]);       //调试后:j的值为4

       k=sizeof(&a[0]);      //调试后:k的值为4

       l=sizeof(&a);        //调试后:l的值为400

       m=sizeof(a[500]);    //调试后:m的值为4

n=sizeof(*&a[0]);   //调试后:n的值为4

}

 

认真分析以上数组的sizeof

可知:i的值正确,数组名代表着整个数组;j的值正确,a[99]代表着数组中的一个元素;k的值正确,&a[0]代表着数组首元素的地址;l的值不正确,因为&a代表着数组首元素的首地址,但VC++6.0给出的是整个数组,故这是VC++6.0软件的一个bugm的值正确,尽管没有a[500]这个元素,但是sizeof关键字的求值是在编译的时候,而函数的求值是在运行的时候,故此时编译器还不知道有没有a[500]这个元素;n也正确,*&a[0]代表着首元素的内容。

以上分析发现了VC++6.0的一个bug

 

下面分析VC++6.0软件的第二个错误!

下面在分析一下指针的sizeof
void main()

{

       int i=0,j=0;

 

int m=10;

       int *q=&m;

       *q=NULL;

 

       int *p=NULL;

 

       i=sizeof(p);     //调试后:i的值是4,

       j=sizeof(*p);    //调试后:j的值是4

}

下面分析一下:

其中,i的分析很简单,p是个指针变量,在32位机器下,它的值是固定的,等于4

j的分析也很简单,*p为指针变量内存的数据,即指向的数据类型的地址!它指向的是int型的,故为4,如果它指向的是char型的,此时j的值就为1;此时,没有错误。重点看下面的:

void main()

{

       int i=0,j=0;

 

int m=10;    //调试发现,m的地址是0x0012ff72

       int *q=&m;

       *q=NULL;

 

int *p = (int *)0x0012ff72;

*p=NULL;

p=NULL;

}

 

主要分析这个函数的下面的三行代码:

当执行完第二步之后,*p的值为NULL,很正常,但是调试后,发现,p的值是0x00000000,这就不正确了,因为p本身的值还没有改变呢,编译器这样处理就错了。

但是有趣的是,我有时候用VC++6.0软件重新调试后,p的值有时候是0x0012ff7c,嘿,这就对了,这说明编译器很不稳定,它有时候正确有时候错误;

当时当这段程序代码中,加入了int m=10;这一语句,那么调试时p的是就一直是0x0012ff7c,此时不会出错。

这也算是VC++6.0上的一个bug吧,所以,编译器也是会经常出错的!

posted on 2011-10-25 17:42  C_易水寒  阅读(292)  评论(0编辑  收藏  举报