2017-01-14 16 views
-1

lastnameが動的な親の動的配列を作成する必要があります。 しかし、文字列の文字を読み取る際にエラーが発生しました。ここでダイナミックな文字列を持つ動的配列。文字列の文字を読み取るエラー

parent ** getParents(){ 
    parent parent_in; 
    parent** parentsArray=NULL; 
    char answer; 
    int i, numOfParents=0,fExit=0; 

    do 
    { 
     printf("Do you wan't to enter parent? Y/N\n"); 
     flushall(); 
     scanf("%c", &answer); 
     if (answer == 'N') 
     { 
      fExit = 1; 
     } 
     else 
     { 

      parent_in.lastname = (char*)malloc(20 * sizeof(char)); 

      parentsArray = (parent**)realloc(parentsArray, 1 * sizeof(parent*)); 
      parentsArray[numOfParents] = (parent*)calloc(1, sizeof(parent)); 

      printf("Please enter the lastname and num of childrens\n"); 
      scanf("%s %d", &parentsArray[numOfParents]->lastname, &parentsArray[numOfParents]->numOfChildren); 

      numOfParents++; 
      free(parent_in.lastname); 
     } 
    } while (fExit == 0); 

    return parentsArray; 
} 

親の構造体である:

struct Parents{ 
    char *lastname; 
    int numOfChildren; 
}typedef parent; 
+0

[C ' ''でのmalloc() 'と家族の戻り値をキャストさせない理由でこの議論を参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+1

'mytype **'のようなものは、 "動的配列"ではなく、最初のポインタへのポインタです。ただし、動的に割り当てられた** _ _Jagged配列_のために使用できます。 – Olaf

+1

あなたは[___MCVE___](http://stackoverflow.com/help/mcve)の作成に気をつけますか? –

答えて

1

あなたがparentsArrayを使用したデータ構造parent_inの使用を混ぜてあなたのコードは、少し有線であり、それはエントリです。あなたはその1つをmallocし、それを他のもので使用します(例えば、parent_inに関して)。

  1. あなたはすなわちscanf("%s %d", &parentsArray[numOfParents]->lastname, ...、未初期化ポインタに文字列をscanf関数:

    しかし、あなたのエラーに関する、私はすぐに見る二つの主要な問題があります。親構造体のためのスペースを予約している可能性があります。この構造体にはlastnameへのポインタがあり、それ自体は "malloced"しません。

  2. parentsArray = (parent**)realloc(parentsArray, 1 * sizeof(parent*))には常に同じ数のエントリが割り当てられます。あなたはおそらくrealloc(parentsArray, (numOfParents+1) * sizeof(parent*))を意味しました。

"文字列の読み込みエラー"の原因はポイント1であるとします。これを克服すれば、ポイント2が次のメモリ破損につながると確信しています。

+0

正確なポイント1は問題を引き起こします。そして、私は動的文字列に入力文字列を割り当てようとしています。 –

関連する問題