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

[复制链接]
1480|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这个地址.   
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
ayb_ice 发表于 2018-3-12 11:37 | 显示全部楼层
是否报错,报警看具体编译器,语法是没有问题的
linqing171 发表于 2018-3-13 22:14 | 显示全部楼层
用ADS编译器,应该都不会报错。
用微软的managed c++/CLI ,这几个应该都会编译不过。
用BCB,开启code guard功能,或者自己替换fast memory manager, p赋值的时候应该没有问题,但是给*p赋值的时候肯定会报错。
Lbsonggz 发表于 2018-3-14 08:56 | 显示全部楼层
C语言规定,buffer[n]可以引用的下标是0~(n-1),
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

244

帖子

2

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