c-通过指向数组元素的指针修改数组的元素



给定代码:

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, 

我做错了什么?

问题是,您在每个循环的第一个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]); 
}

使用此方法,指针不会递增,它始终指向数组的开头,访问其索引是安全的。

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

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

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

这里,指针(pv(增加5倍,当控件退出循环时,指针(pv(现在指向超出数组大小(vector(范围的东西由于您在second-for循环中使用相同的指针变量来打印数组(向量(值,因此将打印垃圾值。

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

pv= vector;
// or
pv = &vector[0];

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

最新更新