打印

这样写编译器会报错么?

[复制链接]
5562|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2009-12-2 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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
5
mohanwei| | 2009-12-2 13:17 | 只看该作者
研究到这种程度算是走火入魔了……

使用特权

评论回复
6
yunding| | 2009-12-2 13:21 | 只看该作者
负数是补码,应该很大了

使用特权

评论回复
7
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

使用特权

评论回复
8
xlsbz|  楼主 | 2009-12-2 14:11 | 只看该作者
研究到这种程度算是走火入魔了……
mohanwei 发表于 2009-12-2 13:17


怎么可能呢!!??:curse:

使用特权

评论回复
9
xlsbz|  楼主 | 2009-12-2 14:14 | 只看该作者
这不是纯粹找拍吗?

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

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

说说
unsigned char i;  和unsigned char i[1] 之间啥区别?

使用特权

评论回复
10
xlsbz|  楼主 | 2009-12-2 14:15 | 只看该作者
数阻下标编译是不审查的。不仅如此,运行时为了效率起见也不审查。故,数阻的下标使用起来要特别的小心,越界犯规通常走的都是这个“后门”。
HWM 发表于 2009-12-2 12:19


为啥不审查?考虑过没?

使用特权

评论回复
11
HWM| | 2009-12-2 14:20 | 只看该作者
为啥不审查?考虑过没?
xlsbz 发表于 2009-12-2 14:15

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
12
inter_zhou| | 2009-12-2 14:31 | 只看该作者
楼主到底想说明什么问题?

使用特权

评论回复
13
xlsbz|  楼主 | 2009-12-2 14:31 | 只看该作者
因为数组源于指针,固然不审查。
你看C中的指针是否审查?
HWM 发表于 2009-12-2 14:20


指针 a 是一个地址不审查

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

keil是不审查....但是VC++6.0给了个警告。

使用特权

评论回复
14
xlsbz|  楼主 | 2009-12-2 14:34 | 只看该作者
楼主到底想说明什么问题?
inter_zhou 发表于 2009-12-2 14:31


楼主位已经说得很清楚了

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

:lol

啥问题说明不了!

NO!

说明了千万不要越界啊!!!

使用特权

评论回复
15
mohanwei| | 2009-12-2 16:18 | 只看该作者
-1,实际就是0xFFF...FF,对于8位机,可能会给你转成0xFF(255),0xFFFF(65535);32位机,很可能就是0xFFFFFFFF了
还没见过有想楼主这么用的。也许能编译通过,但是结果很严重!

使用特权

评论回复
16
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一直都是空空如也。这只是软仿真而已。如果是硬仿真,早就跳出内存非法访问的中断了

使用特权

评论回复
17
zq1987731| | 2009-12-2 16:31 | 只看该作者
[-1]可以用在需要数组下标由1开始的场合:
int a[100];
int *p;
p = &a[-1];
然后p[1]~p[100]就一一对应a[0]~a[99]

使用特权

评论回复
18
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:
没过年就忽悠我呢?

使用特权

评论回复
19
xlsbz|  楼主 | 2009-12-2 17:05 | 只看该作者
-1,实际就是0xFFF...FF,对于8位机,可能会给你转成0xFF(255),0xFFFF(65535);32位机,很可能就是0xFFFFFFFF了
还没见过有想楼主这么用的。也许能编译通过,但是结果很严重! ...
mohanwei 发表于 2009-12-2 16:18

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

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

a[1] = 100;

}


你试试这个代码在while处能不能停住?:lol

使用特权

评论回复
20
xlsbz|  楼主 | 2009-12-2 17:07 | 只看该作者
void main(void)
{
INT8U b[5] = {1,2,3,4,5};
INT8U a[3];

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

a[1] = 100;

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝