指针数学与数组索引
我知道这已经过了很多次,但是今天我遇到了一个案例,震惊了我对指针数学/数组索引的理解。
正如我总是理解的那样,&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)
(在p
或i
是更复杂的表达式的情况下,我忽略了对额外括号的需要),其中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