reallocで動的メモリ確保

書いたのでメモ書き


#include
#include
#include

int main(void){
 char *str, *strDummy, **data, **dataDummy;
 int i, j, sCnt = 0, lCnt = 0;

 // メモリ確保
 str = (char *)malloc(sizeof(char));
 if(str == NULL){
  fprintf(stderr, "allocation is Faild\n");
  return -1;
 }

 // メモリ確保
 data = (char **)malloc(sizeof(char*));
 if(data == NULL){
  fprintf(stderr, "allocation is Faild\n");
  return -1;
 }

 printf("EOFで入力終了\n");

 while((*(str + sCnt)=getchar()) != EOF){
  // 改行コードが来たら行の終了
  if('\n' == *(str + sCnt)){
   // 改行文字を終端子へ書き換え
   *(str + sCnt) = '\0';

   // メモリを再確保
   dataDummy = (char **)realloc(data, sizeof(char *)*(lCnt+1));
   if(dataDummy == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }else{
    data = dataDummy;
   }

   // メモリを確保
   *(data + lCnt) = (char *)malloc(sizeof(char*)*(sCnt+1));
   if(*(data + lCnt) == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }

   // 文字列格納
   memcpy(*(data + lCnt), str, sCnt+1);

   // 行数を増やす
   ++lCnt;

   // 初期化
   sCnt = 0;
   free(str);
   str = (char *)malloc(sizeof(char));
  }else{
   // メモリを最確保
   strDummy = (char *)realloc(str, sizeof(char *)*(sCnt+1));
   if(strDummy == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }else{
    str = strDummy;
   }

   // 文字数加算
   ++sCnt;
  }
 }

 printf("\nLine Num is %d\n",lCnt);
 for(i=0;i");
  for(j=0;*(*(data + i) + j)!='\0';++j){
   printf("%c", *(*(data + i) + j));
  }
  // それぞれメモリ解放
  free(*(data + i));
  printf("\n");
 }

 // メモリ解放
 free(str);
 free(data);

 return 0;
}


エラー処理が甘い( ゚д゚)!

コメント

このブログの人気の投稿

カーソルキーさん@つかわない インサートモード編

Android で MIME Type 判別

Erlang & Elixir Fest 2019 に参加してきた