【C言語】
strcpy,strcatが暴走する
終端文字’\0’のない文字配列

strcpy,strcatが暴走する

■strcpy,strcatが暴走する

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

int main(void){
    char    s1[5] = "/root";
    char    s2[5] = "/file";
    char    output[256] ;
    strcpy(output,s1);
    strcat(output,s2);
    puts(output);
}

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

配列 s1[5],s2[5]には
終端文字’\0’がありません。
配列の後ろに何があるか不明です。

なので文字列操作関数は
終端文字’\0’を見つけられず暴走する可能性があります。


➡暴走結果の例

./a.out
/root/file@/file/root/file@

筆者環境下の結果なので
暴走結果どうなるかは誰にもわかりません。


■修正例(配列要素数は書かなくてOK)

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

int main(void){
    char    s1[] = "/root";
    char    s2[] = "/file";
    char    output[256] ;
    strcpy(output,s1);
    strcat(output,s2);
    puts(output);
}

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

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


➡要素数を省略すると期待する結果が得られる

./a.out
/root/file

参考:

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

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