0
#include <stdio.h>

int main(void) {
    int a[5], *p, i;
    p = a;
    p = (int []){1, 2, 3, 4, 5};
    for (i = 0; i < 5; i++, p++) {
        printf("%d == %d\n", *p, a[i]);
    }
    return 0;
}

你瞧(YMMV):

$ gcc -O -Wall -Wextra -pedantic -std=c99 -o test test.c; ./test
1 == -1344503075
2 == 32767
3 == 4195733
4 == 0
5 == 15774429

通过指针算术打印该数组表明它确实包含一个 1 到 5 的整数序列,但再次打印据称是通过 indeces 表示的相同数组会给出未初始化的废话。为什么?

4

5 回答 5

4

您只分配给p,从不分配给a,因此a永远不会被初始化。

int a[5], *p, i;
// a uninitialized, p uninitialized
p = a;
// a uninitialized, p points to a
p = (int []){1, 2, 3, 4, 5};
// a uninitialized, p points to {1, 2, 3, 4, 5}
于 2011-12-14T15:30:27.043 回答
2

您永远不会初始化a's 元素。两个任务p改变wherep点;两个赋值都不a对它的元素做任何事情。

于 2011-12-14T15:30:43.103 回答
1

您分配ato的值p,然后立即用另一个整数数组的值覆盖它。在printf("%d == %d\n", *p, a[i]) *p并且a[i]不再引用内存中的相同位置,并且a保持未初始化(因此是垃圾)。

于 2011-12-14T15:31:56.500 回答
0

您正在分配一个数组指针,您不会将数据复制到数组。因此,您从一个来源获取数据,而从另一个来源获取数据。

于 2011-12-14T15:30:36.167 回答
0

您的代码等效于:

int a[5];
int b[5] = { 1, 2, 3, 4, 5 };

for (i = 0; i < 5; i++)
    printf("%d == %d\n", b[i], a[i]);

由于a未初始化,因此您会得到不可预测的值(实际上,即使读取这些变量也是未定义的行为)。

于 2011-12-14T15:33:06.827 回答