我已经开始了C的入门课程。我无法解释我从运行下面的代码得到的输出
./a.out 6
输出是:
Array A elements: 0 1 2 3 4 5
Array B elements: 1 2 3 4 5 796830176
我认为代码正在做什么: 执行manup_array时,各个指针的每个值都会递增,但由于它是后置修复,因此只有在返回原始值后才会生效。
是的,当我们首先打印数组A时,我们得到0 1 2 3 4 5
(即在增加之前)。
随后当我们打印数组B时,增量生效,因此我们得到1 2 3 [...]
真正困扰我的是为什么最后一个数字是796830176.此外,在各种计算机上运行它会每次产生不同的最后一个数字,这表明指针寻址在某种程度上对此负责。
有人可以向我解释一下吗?
注意: 如果我使用预定位运算符,则每个阵列的输出相同(1 2 3 4 5 6)。这与我的想法一致 - >指针不会改变;只有值得到更新。
#include <stdio.h>
#include <stdlib.h>
void manup_array(int *array[], int n); // Forward declaration.
int main(int argc, char *argv[])
{
// The size N of 2 arrays are the same; obtain them from cmd line.
int N = atoi(argv[1]); // Convert from str to int in C.
int arrayA[N]; // Declare integer array.
int *arrayB[N]; // Declare integer pointer array.
for (int i = 0; i < N; i++)
{
arrayA[i] = i;
arrayB[i] = &arrayA[i]; // Assign address of each element in A to element in B.
}
manup_array(arrayB, N);
printf("Array A elements: ");
for (int i = 0; i < N; i++)
{
printf("%d ", arrayA[i]);
}
printf("\n");
printf("Array B elements: ");
for (int i = 0; i < N; i++)
{
printf("%d ", *arrayB[i]);
}
printf("\n");
return 0;
}
void manup_array(int *array[], int n) { // Take in B as input, then increase each elem by 1
for (int i = 0; i < n; i++)
{
*array[i]++;
}
}
答案 0 :(得分:1)
这是非常模糊的代码。是做什么的:
该函数将一个指针数组作为参数。由于函数的参数类型为int *array[]
,因此array
项的任何更改都会影响调用者并更改arrayB
。
该函数的有趣部分是*array[i]++;
。 C语言中的运算符优先级规则[]具有比postfix ++更高的prio,后者具有比一元*更高的prio。
由于array
是指针数组,array[i]
会为您提供指针。不是它指出的价值。然后++
递增指针以指向main arrayA
中的下一个项目。
最后有一个*
,它获取指针指向的内容,然后对它们不做任何处理。 *
是多余的,只是让读者感到困惑。
回到主要部分,你已经改变了arrayB
的所有指针。 arrayB[0]
现在指向arrayA[1]
,依此类推。 arrayB的最后一项将指向一个项目超过arrayA的结尾,因此对于最后一项,您访问数组越界并获得垃圾值。
答案 1 :(得分:0)
manup_array()
递增指针,而不是预期的值。
已修改 manup_array()。
void manup_array(int *array[], int n) { // Take in B as input, then increase each elem by 1
for (int i = 0; i < n; i++)
{
//*array[i]++;
(*array[i])++;
}
}
答案 2 :(得分:0)
void manup_array(int *arr[], int n) { // Take in B as input, then increase each elem by 1
for (int i = 0; i < n; i++)
{
int val = (*arr[0]); // get the value pointed to by the current value of arr
val++; // increment it
*(arr[0]) = val; // assign it back
arr++; // increase the pointer
}
}
令人难以置信的迟钝,但它表明了你的意思以及你的模糊代码如何混淆操作员。
添加,使调试更容易!