我知道这已经过了很多次,但是我今天遇到了一个案例,震惊了我对指针数学/数组索引的理解.
正如我总是理解的那样,&mybuff [10]和(&mybuff + 10)是重新记忆相同记忆的方法.
但是我花了一个上午打架的案例:
memcpy(&mybuff+10,&in,8);
Run Code Online (Sandbox Code Playgroud)
当使用优化编译时,溢出缓冲区,并且在编译用于调试时工作正常.
而在同一时间,
memcpy(&mybuff[10],&in,8);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下工作得很好.
非常感谢任何想法或指针.
看到http://cplusplus.com/doc/tutorial/operators/运营商的优先顺序
&mybuff+10 一样(&mybuff)+10
&mybuff[10]喜欢&(mybuff[10])
编辑
一些指针http://cplusplus.com/doc/tutorial/pointers/
mybuff为了这个例子,我将发明一个声明:
char mybuff[123];
Run Code Online (Sandbox Code Playgroud)
现在,&mybuff+10指针是否为算术&mybuff,其类型为"指向123个字符数组的指针".这是不同的从普通mybuff其中(后指针衰减)的类型是"字符指针".这两个表达式的位值是相同的,但由于它们是指向不同大小的事物的指针,因此它们在指针算法下表现不同.
&mybuff+10意味着你想要超过类型中的123个char数组中的十个(这在声明中是无意义的并且可能是段错误的),而mybuff+10只是说你想要超过十个单独的字符.
&mybuff[10]相当于&mybuff[0] + 10相当于mybuff + 10
数组索引是根据指针算术定义的。 p[i]意思是*(p+i)(我忽略了额外括号的需要,以防万一p或者i是一个更复杂的表达式),其中p是一个指针值,i是一个整数值。
小知识:由于加法,即使是指针+整数加法,也是可交换的,p[i]也可以写成i[p]. 是的,4["Hello"] == 'o'。对于任何人谁读您在未来的代码着想,请不要不利用这方面的知识。
comp.lang.c FAQ 的第 6 节是关于 C(和 C++,其中规则几乎相同)中数组和指针之间关系的极好参考。(我本可以直接链接到第 6 部分,但我喜欢鼓励人们浏览它;整个内容值得一读。)