以下のように文字列を取得する %s を含む malloc と scanf を使用した以下の単純なプログラムでは、理解できない出力が得られます。私は 5 バイトしか「malloced」していませんが、入力文字列は上記のサイズを超えていますが、セグメンテーション違反はありません。scanf は malloc 割り当てを上書きしていますか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char * name;
int SZSTRING;
printf("Enter size of name :");
scanf("%d", &SZSTRING);
name = (char*) malloc ((SZSTRING + 1) * sizeof(char));
printf("Enter name :");
scanf("%s", name);
printf("len of 'name' : %d\n",strlen(name));
printf("name final: \"%s\"\n",name);
free(name);
return 0;
}
Output:
OptiPlex-380:~/gsa/compile$ gcc -o try try.c
OptiPlex-380:~/gsa/compile$ ./try
Enter size of name :4
Enter name :qwertyui
len of 'name' : 8
name final: "qwertyui"
ここでもう 1 つ気付きました。
//scanf("%s", name);
出力ショー
len of 'name'= 0
「malloced」の場所は、実際には NULL に memset されていました。しかし、man-page に従って割り当てられたバイトを 0 に初期化する malloc ではなく calloc ???