两个很有意思的程序小题目
转自CSDN的两个C++程序题目
原题如下.
#include<stdio.h>
#include<certexit.h>
void main(void)
{
int i;
int name[10];
for(i=0;i<=10;i++)
name[i]=0;
printf("done!");
exit(1);
}
估计大家的第一反应就是数组越界.i<=10,而name[].length只有10
然而结果并不是我们想象的数组越界报错.会根据编译器的不同触发不同的处理.
首先解释一下.由于ESP是向下压栈的,所以我们声明的局部变量i, name存放顺序虽然是先i 后name,但是name 会处于内存地址的高阶,i 处于低阶.此时name和i是连续地址的存放,所以,name[10]时,编译器写入的是i 所在的内存块值,所以就相当于一个
for(i=0;i<=10;i++) if(读取到name[10]) ; 伪码 i = 0;
就死循环了.
当然这个和编译器有关,VS6,03下似乎都是死循环,05下为了防止这种问题,在相邻的变量中也留了8位空内存,就会正常越界报错了.
void fun(){
int a; int b; }
在05下,a,b内存地址将相间8个空字节.
另外一个题目是这样的
#include <stdio.h>
void main()
{
int a[10];
if( sizeof(a) > -1 )
printf("数组长度比较大");
else
printf("-1比较大");
}
很明显,sizeof(a)值是40,明显比-1大,但结果却不是这样的,输出的是”-1比较大”.
Why? 因为sizeof()出来的类型是size_t,一般定义为unsigned int型,当它与int类型的-1比较时,-1会被转换为无符号整形,值是423894843,确实比40大了..
当然我们如果定义int类型的变量还存储的话就不会出现这种问题了,例如
int a = sizeof(a);
if( a > -1 )….
小题目带来大思考哦~