int arr[5] = {1, 2, 3};
int *p1, *p2;
p1 = arr;
p2 = &arr[3];
printf("%d\n", (*p1)++ + --(*p2));
据我了解, 第一行初始化一个包含5个存储空间的数组,仅填充位置0,1和2。 然后在第3和第4行,p1指向数组位置0,p2指向数组位置3,它是空的。 所以在第5行,当问题试图打印(* p1)++ + - (* p2)时,由于p2指向不包含任何值的内存,它会打印什么?
答案 0 :(得分:2)
如果初始化器的数量少于数组元素,则额外的数组元素将初始化为零。
This answer引用了C99标准的相关部分:
C和C ++标准保证即使是整数数组也是如此 位于自动存储器上,如果a中的初始化器较少 括号括起来然后未初始化的元素必须是 初始化为0。
C99标准6.7.8.21
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者更少的字符 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。