将复合文字指定给数组指针会在同一个地方和时间给出预期结果和垃圾吗?

时间:2011-12-14 15:28:33

标签: c arrays pointers c99 compound-literals

#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表示的相同数组会给出未初始化的废话。为什么呢?

5 个答案:

答案 0 :(得分: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}

答案 1 :(得分:2)

您永远不会初始化a的元素。 p的两个作业都会更改p点的位置;分配对a或其元素都没有任何作用。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您要分配数组指针,不要将数据复制到数组。所以你从一个来源获得数据,从另一个来源获得垃圾。

答案 4 :(得分: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未初始化,因此会得到不可预测的值(实际上即使读取这些变量也是未定义的行为)。