【发布时间】:2014-03-07 11:34:27
【问题描述】:
我已经开始了 C 的介绍性课程。我无法解释运行下面的代码得到的输出
./a.out 6
输出是:
Array A elements: 0 1 2 3 4 5
Array B elements: 1 2 3 4 5 796830176
我认为代码在做什么: 执行 manup_array 时,各个 pointers 的每个 value 都会递增,但由于是 post-fix,只有在返回原始值后才会生效。
确实,当我们首先打印数组 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]++;
}
}
【问题讨论】:
-
这个是你写的还是作为你应该学习的例子传递的?在后者的情况下,向你的老师扔一个西红柿,然后忘记整件事;你不会在真正的应用程序中编写这样的代码......
-
[]-operator 比*-operator 绑定得更紧密。因此,请检查您的代码,了解两者都应用于同一个变量的位置,并检查它们的使用是否真的符合预期。