はじめまして、やまもと@ふくしま です。よろしくお願いします。
構造体を使った簡単なゲームを作ったのですが、ポインターを使ったところ
動作がおかしくなってしまいました。
本を読んだのですが、原因がつかめず、苦労しております。
どなたか、お知恵を貸していただけると大変助かります。


プログラム説明 CSV形式で読み込んだテキストデータを
          順番に構造体に代入していくプログラムです。




A)とりあえず動くバージョン
 sinario型構造体のtext1は配列として、strcatでコピーしている。→正常に動作し
ます。


struct sinario {/* シナリオ構造体の定義 */
 int next;
 int flag1;  /* yes */
 int flag2;  /* no */
 char text1[200];
};
struct sinario data[MAX_DATA]; /*シナリオデータ本体:グローバル定義*/
struct sinario presen_data;/*シナリオデータ表示用構造体 */

void file_read(void){

  FILE *fp;

  char data1[10],data2[10],data3[10],data4[200];
  char buff[255];
  int i;

  i = 0; /* 行数カウンター初期化 */

  if((fp = fopen(FILE_NAME,"r")) == NULL){
    printf("シナリオファイルが存在しません");
    exit(1);/* ファイルが無ければプログラム終了 */
    }

  while(1){
    if(fgets(buff,sizeof(buff)-1,fp) == NULL) break;
    /* ファイルから読み込むデータが無ければ無限ループを抜ける */
    /* 読み込むデータがあれば1行まるごとbuffに格納 */

    sscanf(buff,"%[^,\t],%[^,\t],%[^,\t],%[^,\t]",data1,data2,data3,data4);
    /* カンマごとに文字列を区切ってdata1〜data4に代入 */

    data[i].next = atoi(data1); /* 文字列を整数に変換 */
    data[i].flag1 = atoi(data2); /* 文字列を整数に変換 */
    data[i].flag2 = atoi(data3); /* 文字列を整数に変換 */
    strcat(data[i].text1,data4);/* 構造体のメンバにデータを代入 */

    i = i + 1; /* 行番号をインクリメント */
    }

  fclose(fp); /* オープンしたファイルを閉じる:必修 */
}



B)動作がおかしいバージョン
  text1をポインターに変更。
  メモリの確保はmallocを使用している。
  呼び出し側で表示させると、全てのtext1に同じデータが入ってしまった。


struct sinario {/* シナリオ構造体の定義 */
 int next;
 int flag1;  /* yes */
 int flag2;  /* no */
 char *text1;
};
struct sinario data[MAX_DATA]; /*シナリオデータ本体:グローバル定義*/
struct sinario presen_data;/*シナリオデータ表示用構造体 */

void file_read(void){

  FILE *fp;

  char data1[10],data2[10],data3[10],data4[200];
  char buff[255];
  int i;  /* 行数カウンタ */
  int len; /* シナリオの長さ */

  i = 0; /* 行数カウンター初期化 */

  if((fp = fopen(FILE_NAME,"r")) == NULL){
    printf("シナリオファイルが存在しません");
    exit(1);/* ファイルが無ければプログラム終了 */
    }

  while(1){
    if(fgets(buff,sizeof(buff)-1,fp) == NULL) break;
    /* ファイルから読み込むデータが無ければ無限ループを抜ける */
    /* 読み込むデータがあれば1行まるごとbuffに格納 */

    sscanf(buff,"%[^,\t],%[^,\t],%[^,\t],%[^,\t]",data1,data2,data3,data4);
    /* カンマごとに文字列を区切ってdata1〜data4に代入 */


    data[i].next = atoi(data1); /* 文字列を整数に変換 */
    data[i].flag1 = atoi(data2); /* 文字列を整数に変換 */
    data[i].flag2 = atoi(data3); /* 文字列を整数に変換 */


    len = strlen(data4);  /* 文字長さ取得 */
    data[i].text1 = malloc(sizeof(char)*len); /* メモリーを必要な分確保 */
    data[i].text1 = data4;


    i = i + 1; /* 行番号をインクリメント */
    }

  fclose(fp); /* オープンしたファイルを閉じる:必修 */
}

以上よろしくお願いします。