C中的指针跟踪

时间:2016-11-21 18:56:20

标签: c arrays initialization

  1. 以下代码片段的输出是什么?
  2. 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指向不包含任何值的内存,它会打印什么?

1 个答案:

答案 0 :(得分:2)

如果初始化器的数量少于数组元素,则额外的数组元素将初始化为零。

This answer引用了C99标准的相关部分:

  

C和C ++标准保证即使是整数数组也是如此   位于自动存储器上,如果a中的初始化器较少   括号括起来然后未初始化的元素必须是   初始化为0。

C99标准6.7.8.21

  

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者更少的字符   用于初始化已知大小的数组的字符串文字   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。