在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 )....
小题目带来大思考哦~
#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 )....
小题目带来大思考哦~
相关文章推荐
- 异地分居几乎没有夫妻生活,通过调查取证发现妻子有出轨情况怎么办?-CSDN论坛-CSDN.NET-中国最大的IT技术社区
- 能力测试III(题目源自于CSDN论坛)
- 能力测试I(题目源自于CSDN论坛)
- 数据库能力测试I(题目源自于CSDN论坛)
- 昨天和今天发现的CSDN博客的两个问题
- 题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
- [C#学习杂记] CSDN上看到的一个题目
- 上了几天论坛 发现一点
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 不会用csdn的论坛了
- 又发现两个国内的牛人
- 题目 :两个链表的和
- 发现CSDN的一个Bug
- 发现Google地图两个严重的缺陷
- (笔试中的题目)一个已经排序好的数组找到两个数字相加等于一个给定的数
- 题目:两个整数相除
- C++问题集(转自csdn论坛)
- 《剑指Offer》题目:合并两个排序的链表
- CSDN的RoR论坛开版
- 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。