您的位置:首页 > 其它

在CSDN的论坛中发现的两个小题目

2007-06-06 13:55 302 查看
在CSDN的论坛中发现的两个小题目

#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 )....

小题目带来大思考哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: