前提
以下のような、テキストファイルを読み込むプログラムを考えます。
c
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct {//構造体の定義 5 int num;//数字を保存 6 char c;//アルファベットを保存 7} Kouzo; 8 9void read(Kouzo *ptr);//プロトタイプ宣言 10 11int main(void){ 12 Kouzo *ptr = (Kouzo *)malloc(sizeof(Kouzo)); //要素1つ分の構造体を作成 13 read(ptr); //別関数でデータ読み込み 14 free(ptr); //メモリ解放 15} 16 17 18void read(Kouzo *ptr){ 19 FILE *file = fopen("test.txt","r"); /*ファイルを読む*/ 20 char buf[300]; 21 int loop = 0; //読み込んだ行数 22 while(fgets(buf,sizeof(buf),file)!=NULL){ //fgetsで1行読む 23 sscanf(buf,"%d,%c",&ptr[loop].num,&ptr[loop].c); //sscanfでデータを分割して読む 24 printf("%d,%c\n",ptr[loop].num,ptr[loop].c); 25 loop++; 26 ptr = realloc(ptr,loop+1); //構造体を追加で動的確保 27 } 28 fclose(file); 29}
テキストファイルの構造は[1桁の数字0~9],[アルファベット大文字A~Z]
となっていますが、何行あるのかは事前に分からないものとします。
text
11,A 22,B 33,C 4...//略
謎な点
今回、test.txtは3行分あるとして、上記をプログラムを実行すると、問題なく動作します。
1,A 2,B 3,C
さて、ここでptr = realloc(ptr,loop+1);
部分をコメントアウトして実行すると、これも問題なく動作します。
1,A 2,B 3,C
Kouzo *ptr = (Kouzo *)malloc(sizeof(Kouzo));
の部分では構造体1つ分の範囲(Kouzo[0]
)しか確保していないので、2行目以降は構造体の範囲外に書き込もうとしてエラーが発生しそうなのですが、なぜか正常に動作します。これは何故でしょうか。
自分で思いついた理由としては・・・↓
・Kouzo *ptr = (Kouzo *)malloc(sizeof(Kouzo));
の部分で、実は構造体が複数要素分確保されている
・たまたまエラーが発生しない部分に書き込んでいる(メモリ破壊が発生している)
のどれかだと思うのですが・・・。
補足情報
C99,gcc

回答1件
あなたの回答
tips
プレビュー