
■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” ;
のように書きましょう。
参考:
https://www.jpcert.or.jp/sc-rules/c-str11-c.html