【C言語】配列の先頭アドレスに配列のサイズを足すと配列の領域外になるバグ

warning: array subscript N is outside array bounds of ‘int[100]’


警告:配列の添字 N は ‘int[100]’ の配列境界の外です。
[-Warray-bounds]


&配列[0]+sizeof(配列) ←多分バグ

//配列の終端アドレスを取得する(間違い編)
#include <stdio.h>
#define     要素数    100
int main(void){
    int     配列[要素数];
    int     x = 0;
    //配列の先頭アドレスに配列のサイズを足すと配列の領域外になるバグ
    for(int *p = &配列[0];p < &配列[0]+sizeof(配列) ;p++){
        *p = x++ ;
        printf("%d\n",*p);
    }
}


&配列[0]+要素数←正しい

//配列の終端アドレスを取得する(正しい編)
#include <stdio.h>
#define     要素数    100
int main(void){
    int     配列[要素数];
    int     x = 0;
    //配列の先頭アドレスに配列の要素数を足すと配列終端アドレスになる
    for(int *p = &配列[0];p < &配列[0]+要素数 ;p++){
        *p = x++ ;
        printf("%d\n",*p);
    }
}

&配列[要素数]←推奨

//配列の終端アドレスを取得する(推奨編)
#include <stdio.h>
#define     要素数 100
int main(void){
    int     配列[要素数];
    int     x = 0;
    // 配列[配列要素数]は不可だが
    //&配列[配列要素数]は可
    for(int *p = &配列[0];p < &配列[要素数] ;p++){
        *p = x++ ;
        printf("%d\n",*p);
    }
}