1

给定代码:

int vector[5] = {1, 2, 3, 4, 5};
int *pv = vector, value = 3;

for(int i = 0; i < 5; i++) {
    *pv++ *= value;
}

for(int i = 0; i < 5; i++) {
    printf("%d, ", *(pv+i));
}

我希望由 指向的数组的每个单独元素pv乘以3. 相反,我得到的输出是:

32766, -1554513907, -527290408, -333409024, 32766, 

我究竟做错了什么?

4

2 回答 2

4

问题是您for在每个循环的第一个循环中增加了指针,所以当您到达它的末尾时,pv已经指向vector.

因此,在第二个for循环中打印的所有值都表示存储在数组边界之外的地址中的残差值,这是典型的未定义行为

一个快速的解决方法是在两个周期之间重置指针:

for (int i = 0; i < 5; i++){
    *pv++ *= value;
}

pv = vector; //here

for (int i = 0; i < 5; i++) {
    printf("%d, ", *(pv + i));
}

或者在两个循环中都使用迭代器 i,因为您已经在 中拥有它for,您不妨使用它:

for (int i = 0; i < 5; i++){
    pv[i] *= value;
}

for (int i = 0; i < 5; i++) {
    printf("%d, ", pv[i]); 
}

使用这种方法,指针不会增加,它总是指向数组的开头,访问它的索引是安全的。

请注意,我使用了数组表示法[],因为它比指针取消引用表示法稍微不那么混乱。

于 2020-10-04T12:24:28.743 回答
0

在您的程序中,第一个 for 循环(即)

for(int i = 0; i < 5; i++) {
    *pv++ *= value;
}

在这里,pointer(pv) 增加了 5 次,当控件退出循环时,pointer(pv) 现在指向超出数组大小(vector) 范围的东西,因为你使用的是相同的指针第二个for循环中的变量以打印数组(向量)值,垃圾值被打印出来。

您可以通过将指针变量(pv)重新分配回数组的第一个位置来解决此问题

pv= vector;

// or

pv = &vector[0];

在你的第二个 for 循环之前。

于 2020-10-06T09:21:40.587 回答