こぼれネット

メモリ消去用の実験テストプログラム

///////////////////////////////////////////////////////////
//                                                       //
//                                                       //
//          メモリ消去用の実験テストプログラム           //
//                                                       //
//                                                       //
//                                                       //
//                                       2014/06/29      //
///////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>

enum sex {woman, man};

typedef struct person {
  enum sex sex;  //性別
  int age; //年齢

  struct person *prev;  /* 前の構造体を示すポインタ */
  struct person *next;  /* 次の構造体を示すポインタ */
} person;



int main ()
{
  // 10人分のデータを作る

  int i, k, count;
  person  *p_person, *p_prev_person, *p_next_person;
  person  *p_first_person, *p_last_person, *temp_p_person;


  printf("checked 0.\n");

  ////////////  現状データの入力 ////////////

   p_person= (person *)malloc(sizeof(person));
  if(p_person == NULL) {
      printf("メモリが確保できません\n");
      exit(EXIT_FAILURE);
   }

  p_person->sex = woman;
  p_person->age = 10;

  p_first_person = p_person;  //最初の一人

  // (最後に)ポインタをリンクする
  p_person->prev = NULL;
  p_prev_person = p_person;

  for(i=9; i>=0; i--){

	p_person= (person *)malloc(sizeof(person));
	  if(p_person == NULL) {
		printf("メモリが確保できません %d\n",i);
		exit(EXIT_FAILURE);
	  }

	  p_person->sex = woman;
	  p_person->age = i;


	  // (最後に)ポインタをリンクする
	  p_prev_person->next = p_person;
	  p_person->prev = p_prev_person;
	  p_person->next = NULL;
	  p_prev_person = p_person;
  }


  p_last_person = p_person; //最後の一人

  printf("checked 1.\n");

  ////////////  現状データの入力 終わり ////////////

  ////////////  データ削除の処理例 ////////////


  p_person = p_first_person;  //最初の一人

  while (p_person != NULL){


	if (p_person->age == 3){

	  // メモリを消す前の処理
	  if (p_person == p_first_person){ // 最初の場合
		p_first_person = p_person->next;
		p_first_person->prev = NULL;
		free(p_person);

		p_person = p_first_person;

		printf("C1:");
	  }
	  else if (p_person == p_last_person){ //最後の場合
		p_last_person = p_person->prev;
		p_last_person->next = NULL;
		free(p_person);

		p_person = p_last_person;

		printf("C2:");
	  }
	  else {
		p_person->next->prev = p_person->prev;
		p_person->prev->next = p_person->next;
		temp_p_person = p_person->prev; // 一つ前のポインタに退避

		free(p_person);

		p_person = temp_p_person;

		printf("C3:");
	  }
	}

	p_person = p_person->next;

  }

  ////////////  確認フェーズ ////////////

  if (p_first_person == p_last_person){
	printf("passed exit\n");
	exit(0);
  }



  p_person = p_first_person;

  while (p_person != NULL){
	printf("%d ",p_person->age);
	p_person = p_person->next;
  }


}






#if 0
  p_person = p_first_person;

  while (p_person != NULL){
	printf("%d ",p_person->age);
	p_person = p_person->next;
  }

  p_person = p_last_person;

  while (p_person != NULL){
	printf("%d ",p_person->age);
	p_person = p_person->prev;
  }

#endif
モバイルバージョンを終了