转自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 )….

小题目带来大思考哦~