打印

请教一个关于数组的问题

[复制链接]
2202|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxb1717|  楼主 | 2012-3-4 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在A文件中定义了一个数组:
unsigned char data[10];                      //10个
如果在B文件中要用到这个数组,但一不小心写错了数组大小,既:extern unsigned char data[6];     //6个


编译的时候没有警告和错误,那在B文件中如果出现以下语句:
unsigned char  *dat;
dat = data;
*(data+8)  = 0x15;  
...................................
这个算是数组索引越界了么?请高手点评一下

相关帖子

沙发
Ryanhsiung| | 2012-3-4 18:12 | 只看该作者
可以算是越界了,本质上没有越界!
   兄弟写法要正规啊

使用特权

评论回复
板凳
王紫豪| | 2012-3-4 19:09 | 只看该作者
不建议这样写,但是写了也没问题

使用特权

评论回复
地板
zxb1717|  楼主 | 2012-3-4 19:35 | 只看该作者
不是我这样写,是我现在接手以前一位同事的工作,程序有问题,老是进入FaultISR()中断,现在查找原因查找到数组这了,所以来请教各位高手的,如果这样写也没问题的话,那就不会存在数组越界而导致程序跑飞了

使用特权

评论回复
5
zxb1717|  楼主 | 2012-3-4 19:55 | 只看该作者
3# Ryanhsiung

这样到底有问题还是没问题呢?会造成程序跑飞么?

使用特权

评论回复
6
nongfuxu| | 2012-3-4 22:35 | 只看该作者
看什么编译器了。
好像一般 以unsigned char data[10];  为准;其它文件中使用时只要extern unsigned char data[随便];

使用特权

评论回复
7
jack821119| | 2012-3-5 08:33 | 只看该作者
不会的,编译器只认数组地址,对长度不作判断的.
超过10才算越界.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
哲哲55 + 1 我觉得也应该是这个样子
8
ayb_ice| | 2012-3-5 08:35 | 只看该作者
数组外部声明大小其实是多少都可以(应该是编译器忽略大小),越界问题自己考虑

使用特权

评论回复
9
287334895| | 2012-3-5 09:11 | 只看该作者
可能会有问题,这样指针就不知道指到RAM在哪个空间了,那样寄存器可能会出错

使用特权

评论回复
10
zxb1717|  楼主 | 2012-3-5 21:07 | 只看该作者
看来大家也没有个定论

使用特权

评论回复
11
nelsonfung| | 2012-3-5 22:10 | 只看该作者
借楼学习ing

使用特权

评论回复
12
nelsonfung| | 2012-3-5 22:16 | 只看该作者
借楼学习ing

使用特权

评论回复
13
李富贵| | 2012-3-5 23:31 | 只看该作者
unsigned char  *dat;
dat = data;
*(data+8)  = 0x15;
最后一句是*(dat+8)  = 0x15;吧?

这是个很常见的写法。
*(dat+8)  = 0x15;
data[8] = 0x15;
这两句是完全等效的。

unsigned char data[10]; 这里才是编译器分配空间的地方,data[8] = 0x15; 并未越界。

extern unsigned char data[6];  这里的6没有任何意义,你把6换成任何合理的数字都不影响编译,C编译器不检查数组越界。

使用特权

评论回复
14
ljj0736| | 2012-3-5 23:54 | 只看该作者
楼上正解

使用特权

评论回复
15
linjing| | 2012-3-6 00:53 | 只看该作者
标准C语言编译器是不检查数组越界的,
外部声明的时候可以不注明数组长度,
extern unsigned char dat[];
这样做语法上是完全没有问题的

不过C语言的数组访问确实挺容易出问题,
静态数组访问可以考虑用PC-lint一类的语法检查器进行静态检查,
但如果像 i=11, dat[i] = 0x15这种用法就很难通过语法检测检查出来。

使用特权

评论回复
16
xlsbz| | 2012-3-6 08:09 | 只看该作者
同意楼上  

extern unsigned char dat[];
这样做语法上是完全没有问题的

但是按照misra规则 最好是extern unsigned char dat[10];
原因是为了杜绝sizeof(dat)可能带来的问题。

对边界检测啥都是无能为力

如果好习惯搞个宏定义
#define HHH 10;
unsigned char data[HHH];                     
extern unsigned char data[HHH];   
似乎有时候显得过于啰嗦

===========================

结论 从我目前知道的看 如果没有用到sizeof,那么编译出来的东西没有问题

使用特权

评论回复
17
zxb1717|  楼主 | 2012-3-6 08:15 | 只看该作者
谢谢李大侠的详细解答!

使用特权

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

本版积分规则

31

主题

231

帖子

1

粉丝