【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある

■1.暴走するstrlen

#include <stdio.h>
#include <string.h>

int     main(void){
    char    abcd[4] = "abcd";
    char    efgh[4] = "efgh";

    printf("strlen=%zu\n",strlen(abcd));
}

■2.暴走するprintf

#include <stdio.h>
#include <string.h>

int     main(void){
    char    abcd[4] = "abcd";
    char    efgh[4] = "efgh";

    printf("abcd=%s\n",abcd);
}

■3.暴走するstrcmp

#include <stdio.h>
#include <string.h>

int     main(void){
    char    abcd[4] = "abcd";
    char    efgh[4] = "efgh";
    char    dst[5];

    if(strcmp(abcd,"abcd") == 0)
        puts("同じ");
    else 
        puts("違う");
}

■4.暴走するstrcpy

#include <stdio.h>
#include <string.h>

int     main(void){
    char    abcd[4] = "abcd";
    char    efgh[4] = "efgh";
    char    dst[5];

    strcpy(dst,efgh) ;
    printf("dst=%s\n",dst);
}

これらのプログラムが何と表示するかは動かしてみないと
誰にもわかりません異常終了するかもしれません。

配列 abcd[4] は4byteしかなく
‘a’,’b’,’c’,’d’の後ろに何があるか不明です。
なので文字列操作関数は
終端文字’\0’を見つけられず暴走する可能性があります。

char abcd[4]= “abcd”;のように
文字列長を几帳面に人間が数え
配列の要素数を記入するのは
ハイリスクなので止めましょう。

文字列長はコンパイラが数えてくれるので
char abcd[] = “abcd” ;
のように書きましょう。

参考:

STR11-C. 文字列リテラルで初期化される文字配列のサイズを指定しない

https://www.jpcert.or.jp/sc-rules/c-str11-c.html