这样写编译器会报错么?

[复制链接]
6619|24
 楼主| xlsbz 发表于 2009-12-2 11:59 | 显示全部楼层 |阅读模式
本帖最后由 xlsbz 于 2009-12-2 12:01 编辑

  1. unsigned char  a[1];

  2. a[-1] = a[2];




keil  无论任何版本!

猜猜看!先别动手实验!先回帖,再试验!
bhsdlmj 发表于 2009-12-2 12:09 | 显示全部楼层
这个没有玩过!:victory:
HWM 发表于 2009-12-2 12:19 | 显示全部楼层
数阻下标编译是不审查的。不仅如此,运行时为了效率起见也不审查。故,数阻的下标使用起来要特别的小心,越界犯规通常走的都是这个“后门”。
xwj 发表于 2009-12-2 12:26 | 显示全部楼层
这不是纯粹找拍吗?

姑且不论程序的正确性,但-1到底是多少,这个就很难说,而且肯定与CPU、存储器空间有关,怎么会“eil  无论任何版本! ”呢?

评分

参与人数 1威望 +1 收起 理由
xlsbz + 1

查看全部评分

mohanwei 发表于 2009-12-2 13:17 | 显示全部楼层
研究到这种程度算是走火入魔了……
yunding 发表于 2009-12-2 13:21 | 显示全部楼层
负数是补码,应该很大了
 楼主| xlsbz 发表于 2009-12-2 14:07 | 显示全部楼层
这不是纯粹找拍吗?

姑且不论程序的正确性,但-1到底是多少,这个就很难说,而且肯定与CPU、存储器空间有关,怎么会“eil  无论任何版本! ”呢? ...
xwj 发表于 2009-12-2 12:26

很抱歉一点也不难说。。。。。。。。。

-1 就是0前面那个数   a[-1] 就是a[0]前面那个数字!

数组的本质是啥? 是地址 加 偏移量  

-1 就是 0 向前偏1个 , 1 就是0向后偏一个!

可以运行一下!!试试看!完全ok!

只要不超出 存储器范围 a[-100]也行

哈哈:lol
 楼主| xlsbz 发表于 2009-12-2 14:11 | 显示全部楼层
研究到这种程度算是走火入魔了……
mohanwei 发表于 2009-12-2 13:17


怎么可能呢!!??:curse:
 楼主| xlsbz 发表于 2009-12-2 14:14 | 显示全部楼层
这不是纯粹找拍吗?

姑且不论程序的正确性,但-1到底是多少,这个就很难说,而且肯定与CPU、存储器空间有关,怎么会“eil  无论任何版本! ”呢? ...
xwj 发表于 2009-12-2 12:26

我是老王卖花 自卖自夸!
闲着无聊 玩玩的..........

说说
unsigned char i;  和unsigned char i[1] 之间啥区别?
 楼主| xlsbz 发表于 2009-12-2 14:15 | 显示全部楼层
数阻下标编译是不审查的。不仅如此,运行时为了效率起见也不审查。故,数阻的下标使用起来要特别的小心,越界犯规通常走的都是这个“后门”。
HWM 发表于 2009-12-2 12:19


为啥不审查?考虑过没?
HWM 发表于 2009-12-2 14:20 | 显示全部楼层
为啥不审查?考虑过没?
xlsbz 发表于 2009-12-2 14:15

因为数组源于指针,固然不审查。
你看C中的指针是否审查?

评分

参与人数 1威望 +1 收起 理由
xlsbz + 1

查看全部评分

inter_zhou 发表于 2009-12-2 14:31 | 显示全部楼层
楼主到底想说明什么问题?
 楼主| xlsbz 发表于 2009-12-2 14:31 | 显示全部楼层
因为数组源于指针,固然不审查。
你看C中的指针是否审查?
HWM 发表于 2009-12-2 14:20


指针 a 是一个地址不审查

数组a【100】是  (一个地址不审查) 乘以 100 =  100个地址不审查。

keil是不审查....但是VC++6.0给了个警告。
 楼主| xlsbz 发表于 2009-12-2 14:34 | 显示全部楼层
楼主到底想说明什么问题?
inter_zhou 发表于 2009-12-2 14:31


楼主位已经说得很清楚了

我说:猜猜看啊 让大家猜猜看  这样写行不?

:lol

啥问题说明不了!

NO!

说明了千万不要越界啊!!!
mohanwei 发表于 2009-12-2 16:18 | 显示全部楼层
-1,实际就是0xFFF...FF,对于8位机,可能会给你转成0xFF(255),0xFFFF(65535);32位机,很可能就是0xFFFFFFFF了
还没见过有想楼主这么用的。也许能编译通过,但是结果很严重!
mohanwei 发表于 2009-12-2 16:25 | 显示全部楼层
用hello例程试了一下:
int main (void)  
{
        unsigned char array1[10]={0};
        unsigned char array2[256]={0};
        array2[-1]=1;
        array2[-2]=2;
        while(1)
                     ;
}
编译的时候就有两个警告:
Hello.c(64): warning: C3488E: write to variable 'array2' with offset out of bounds
Hello.c(64): warning: C3488E: write to variable 'array2' with offset out of bounds

单步执行的时候array1一直都是空空如也。这只是软仿真而已。如果是硬仿真,早就跳出内存非法访问的中断了
zq1987731 发表于 2009-12-2 16:31 | 显示全部楼层
[-1]可以用在需要数组下标由1开始的场合:
int a[100];
int *p;
p = &a[-1];
然后p[1]~p[100]就一一对应a[0]~a[99]
 楼主| xlsbz 发表于 2009-12-2 16:58 | 显示全部楼层
用hello例程试了一下:
int main (void)  
{
        unsigned char array1[10]={0};
        unsigned char array2[256]={0};
        array2[-1]=1;
        array2[-2]=2;
        while(1)
                     ;
}
编译的时候就有 ...
mohanwei 发表于 2009-12-2 16:25

你用的啥编译器?若用keil 默认配置下,传统51定义array2[256]能编译通过么?:loveliness:
没过年就忽悠我呢?
 楼主| xlsbz 发表于 2009-12-2 17:05 | 显示全部楼层
-1,实际就是0xFFF...FF,对于8位机,可能会给你转成0xFF(255),0xFFFF(65535);32位机,很可能就是0xFFFFFFFF了
还没见过有想楼主这么用的。也许能编译通过,但是结果很严重! ...
mohanwei 发表于 2009-12-2 16:18

  1. void main(void)
  2. {
  3. INT8U b[5] = {1,2,3,4,5};
  4. INT8U a[3];

  5. while (a[-1] == 5);

  6. a[1] = 100;

  7. }


你试试这个代码在while处能不能停住?:lol
 楼主| xlsbz 发表于 2009-12-2 17:07 | 显示全部楼层
  1. void main(void)
  2. {
  3. INT8U b[5] = {1,2,3,4,5};
  4. INT8U a[3];

  5. while ((a[-1] == 5) && (a[-2] == 4) && (a[-3] == 3) && (a[-4] == 2));

  6. a[1] = 100;

  7. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部