指针数学与数组索引

时间:2011-08-18 20:54:53

标签: c++ c pointers

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

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

然而,我花了一个上午的案例来讨论:

memcpy(&mybuff+10,&in,8); 
当编译为优化时,

溢出缓冲区,并且在编译进行调试时工作正常。

同时,

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

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

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

7 个答案:

答案 0 :(得分:7)

请参阅http://cplusplus.com/doc/tutorial/operators/了解运营商的优先顺序 &mybuff+10(&mybuff)+10一样{。}} &mybuff[10]&(mybuff[10])一样{/ 1>}

修改
还有一些指针http://cplusplus.com/doc/tutorial/pointers/

答案 1 :(得分:7)

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

char mybuff[123];

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

&mybuff+10意味着你想要超过类型中的十二个123-char数组(鉴于声明并且可能是段错误,这是无意义的),而mybuff+10只是说你想要步过去十个人的角色。

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分:2)

我认为你有一些指针问题。
如果mybuff是一个指针,那么mybuff + 10 == &(mybuff[10])
这与&mybuff + 10不一样,就像你到达那里一样。

答案 4 :(得分:2)

(&mybuff+10)&mybuff[10] 等效,但&mybuff[10]mybuff + 10是。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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