指针数学与数组索引

我知道这已经过了很多次,但是今天我遇到了一个案例,震惊了我对指针数学/数组索引的理解。

正如我总是理解的那样,&mybuff [10]和(&mybuff + 10)是重新记忆相同内存的方法。

但是我花了一个上午打架的案例:

memcpy(&mybuff+10,&in,8); 

当使用优化编译时,溢出缓冲区,并且在编译用于调试时工作得很好。

而在同一时间,

 memcpy(&mybuff[10],&in,8); 

在这两种情况下工作得很好。

非常感谢任何想法或指针。

请参阅http://cplusplus.com/doc/tutorial/operators/了解运营商的优先顺序
&mybuff+10喜欢(&mybuff)+10
&mybuff[10]喜欢&(mybuff[10])

编辑
还有一些指示http://cplusplus.com/doc/tutorial/pointers/

为了这个例子,我将为mybuff发明一个声明:

 char mybuff[123]; 

现在, &mybuff+10&mybuff mybuff上执行指针算术,其类型为“指向123个字符数组的指针”。 这与普通的mybuff 有所不同 (在指针衰减之后)有类型“指向char的指针”。 这两个表达式的位值是相同的,但由于它们是指向不同大小的事物的指针,因此它们在指针算法下表现不同。

&mybuff+10意味着你想要超过类型中123个字符数组的十个(这在声明中是无意义的并且可能是段错误的),而mybuff+10只是说你想要超过十个单独的字符。

&mybuff[10]相当于&mybuff[0] + 10 ,相当于mybuff + 10

数组索引是根据指针算法定义的。 p[i]表示*(p+i) (在pi是更复杂的表达式的情况下,我忽略了对额外括号的需要),其中p是指针值, i是整数值。

琐事:由于加法,即使指针+整数加法,也是可交换的, p[i]也可以写成i[p] 。 是的, 4["Hello"] == 'o' 。 为了将来读取您的代码的任何人,请不要利用这些知识。

关于C(和C ++中规则几乎相同)的数组和指针之间关系的出色参考是comp.lang.c FAQ的第6部分。 (我可以直接链接到第6部分,但我喜欢鼓励人们浏览它;整个事情值得一读。)

我觉得你有一些指针问题。
如果mybuff是一个指针,那么mybuff + 10 == &(mybuff[10])
&mybuff + 10你的&mybuff + 10一样。

(&mybuff+10)&mybuff[10] 相同,但是&mybuff[10]mybuff + 10都是。

正确的语法是mybuff+10 not &mybuff+10 ,它表示在数组中移动到位置10并复制8个字节(根据memcpy语句)。 目前还不知道你是否可以实际持有额外的8个字节。

它在调试模式下工作的原因是因为在调试模式下,内存是为您初始化的,并且分配也大于实际大小。 http://msdn.microsoft.com/en-us/library/bebs9zyz(v=vs.80).aspx