打印
[STM32]

指令 p=&Buffer[4]为什么没有报错?

[复制链接]
1030|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxdjb|  楼主 | 2018-3-12 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned long Buffe[4]={7,8,9,10};
unsigned long* P

1:  Buffe[4]=1;//超出范围,报错,这个下标应该是0,1,2,3
2:  p=&Buffer[4]; //这个又没有超出范围。这个下标不是0,1,2,3吗?
       p指向的到底是数组里的哪个元素?取出p里面的地址里面的值又不是10,是0?

3:    p=&Buffer[3]; //执行这条指令取出p里面的地址里面的值是10

相关帖子

沙发
gujiamao12345| | 2018-3-12 11:10 | 只看该作者
1.第一个会报错?warning吧;
2.指针指向内存空间,buffer+4这个地址而已;

使用特权

评论回复
板凳
msblast| | 2018-3-12 11:19 | 只看该作者
buffer为基地址,4为地址索引
相当于 p = buffer + 4*sizeof(unsigned long)

使用特权

评论回复
地板
hxdjb|  楼主 | 2018-3-12 11:20 | 只看该作者
gujiamao12345 发表于 2018-3-12 11:10
1.第一个会报错?warning吧;
2.指针指向内存空间,buffer+4这个地址而已;

谢谢!改成  p=&Buffer[5];  是不是 指向了内存空间,buffer+8这个地址.   

使用特权

评论回复
5
msblast| | 2018-3-12 11:26 | 只看该作者
hxdjb 发表于 2018-3-12 11:20
谢谢!改成  p=&Buffer[5];  是不是 指向了内存空间,buffer+8这个地址.

p = &buffer[5];
是不是写错了?

p = &buffer[4];
=>p = buffer + 4*sizeof(unsigned long)
=>p = buffer + 4*4
=>p = buffer + 16

使用特权

评论回复
6
ayb_ice| | 2018-3-12 11:37 | 只看该作者
是否报错,报警看具体编译器,语法是没有问题的

使用特权

评论回复
7
linqing171| | 2018-3-13 22:14 | 只看该作者
用ADS编译器,应该都不会报错。
用微软的managed c++/CLI ,这几个应该都会编译不过。
用BCB,开启code guard功能,或者自己替换fast memory manager, p赋值的时候应该没有问题,但是给*p赋值的时候肯定会报错。

使用特权

评论回复
8
Lbsonggz| | 2018-3-14 08:56 | 只看该作者
C语言规定,buffer[n]可以引用的下标是0~(n-1),

使用特权

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

本版积分规则

127

主题

236

帖子

2

粉丝