我发现的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软件的一个bug;m的值正确,尽管没有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吧,所以,编译器也是会经常出错的!