#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表示的相同数组会给出未初始化的废话。为什么呢?
答案 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])
*p
和a[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
未初始化,因此会得到不可预测的值(实际上即使读取这些变量也是未定义的行为)。