为什么这样打印4 5 6 0 0而不是4 5 6 junk_value junk_value

0 c pointers

#include<stdio.h>

void m(int *p){
    int i=0;
    for(int i=0;i<5;i++)
        printf("%d",p[i]);
}

int main(){
    int a[5]={4,5,6};
    m(a);
}
Run Code Online (Sandbox Code Playgroud)

我预计输出将是4 5 6 junkValue junkValue,但实际输出是4 5 6 0 0

438*_*427 6

在标准的“ 6.7.9初始化”部分中,其说明:

如果用大括号括起来的列表中的初始化程序少于聚合中的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于该数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式地初始化

由于int是静态对象,则代码中使用时初始化为零:

int a[5]={4,5,6};
Run Code Online (Sandbox Code Playgroud)

真的和

int a[5]={4,5,6,0,0};
Run Code Online (Sandbox Code Playgroud)

因此,将不会打印“垃圾值”。它将(并且必须)打印两个零。