1

私は現在、C プログラミングのコースのプロジェクトに取り組んでおり、問題が発生しました。私はまだ C 言語に慣れていませんが、Java のプログラミング経験はあります。

structのchar *変数メンバーに値を割り当てようとすると、プログラムで問題が発生します。問題のコードは以下のとおりです。

void ReadFile(ComponentType * Data, int * numEl, int * numNodes)
{
  size_t index;
  FILE * dataFile;
  char * data;
  float * value;

  numEl = malloc(sizeof(int *));
  numNodes = malloc(sizeof(int*));
  Data = malloc(6 * sizeof(ComponentType));

  * numEl = 0;
  * numNodes = 0;
  index  = 0;   

  if((dataFile = fopen("mydata.dat", "r")) == NULL)
      puts("Error - file \"mydata.dat\" could not be opened!");
  else
  { 

      while(!feof(dataFile)) 
      { 

          fscanf(dataFile, "%s", data);
          Data[index].name = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].name, data);

          fscanf(dataFile, "%s", data);
          Data[index].node1 = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].node1, data);

          fscanf(dataFile, "%s", data);
          Data[index].node2 = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].node2, data);

          fscanf(dataFile, "%f", value);
          Data[index].value = * value;


          int i = char2int(CircuitData[index].node1);
          if(i > * numNodes)
              * numNodes = i;

          i = char2int(CircuitData[index].node2);
          if(i > * numNodes)
              * numNodes = i;

          (* numEl)++;
          (* numNodes)++;
          index++;
      }

      fclose(dataFile);
  }

  free(Data);
  free(numEl);
  free(numNodes);       
}

構造は次のように定義されます。

typedef struct
{
  char * name;
  char * node1;
  char * node2;
  float value;
} ComponentType;

プログラムでデバッグを実行しましたが、基本的にファイルが正しく読み取られ、データに格納されている値が正しいことですが、 Data[index].nameを出力すると、 char *としてフォーマットされている場合にセグメンテーション違反が発生するか、デバッグ プログラムは 0x0 を出力します。要するに、ファイルから読み取られた値は、必要な構造変数にコピーされていません。

任意の提案/ヘルプをいただければ幸いです。ありがとうございました。

編集:Linux 64ビットを使用してコーディングしています

編集2:以下に提案された変更でエラーが発生する関数全体を追加しました

4

1 に答える 1

1

まず、プログラムをデバッグするときは、何が何でsizeof(data)あるかを確認してください。
8 (ポインターのサイズ) であり、6 (割り当てたサイズ) ではないことに驚かれることでしょう。
これはsizeof、型のサイズを測定しdatachar*, (別名ポインター) であるためです。

ポインタは 8 バイトです。(64 ビット システムの場合。他のシステムは異なります)
これにより、 に 8 バイトが割り当てられますData[index].name

次へ=:あなたがしようとしたように、演算子を使用してある配列から別の配列にデータをコピーすることはできません:

Data[index].name = data;

適切に行うには

fscanf(dataFile, "%s", data);
// Measure the length of data, and allocate enough space (including the null-termiantor)
Data[index].name = malloc(strlen(data) + 1);  

// Copy from data into Data[index].name.   For greater safety, look into strcpy_s
strcpy(Data[index].name, data);
于 2013-10-08T19:00:36.953 に答える