2017-02-07 22 views
0

今日私の問題は、構造体の動的配列を割り当てる必要があるということです。私はプログラム全体をコーディングしましたが、segフォルトが発生しています。私は物事を正しく割り当てていないためです。全体的に私はちょうどこれを行う方法と、どこが間違っていたかについて、さらに詳しい情報が必要です。ありがとう!ここでCの構造体の動的配列の割り当て

は私の構造体である:私はnumOfElemsは私が必要とするどのように多くの反復カウントする変数である配列の構造体の数を割り当てたいのはここ

struct names { 
    char *Name1; 
    char *Name2; 
}; 
struct names **namePointer = NULL; 

です。現在は1に設定されていると私はより多くのスペースを必要とする1たびに成長します:

ここ
numOfElems = 1; 
*namePointer = realloc(*namePointer, sizeof(struct names) * numOfElems); 

は私が入力を取得して、配列内の構造体に値を保存する方法です。文字列が指定される前に割り当てられ、その後、このような文字の量のために再割り当てされました:

printf("Enter Name1: "); 
fgets(namePointer[i]->Name1, 50, stdin); 
stringLen = strlen(namePointer[i]->Name1) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 

ループの終わりに、「私は++」と、それはへと再び全体のプロセスを通過していますうまくいけば、構造体配列の次の値に次の値を渡してください。私はsegの欠陥を取得し、理由を不明です。構造体の配列を動的に割り当てる簡単な方法がある場合は、共有してください!

もう一度おねがいします。

+1

コードが何をしていると思っているか教えてください。文字列とループの割り当てを確認する必要があります。また、seg障害はどこですか?これをデバッガで一度だけ実行すると、問題のあるコード行に向かうはずです。 –

+1

なぜ 'struct names **'型が必要ですか? – yano

+0

あなたの変数 'namePointer'は' struct names * namePointer; '型でなければなりません。 'int'の配列を持っていれば' int * ptrIntArray; ' - 同様に' struct names'の配列を使います。書かれているように、構造体へのポインタの配列で必要以上に多くのメモリを割り当てていますが、ポインタを指すポインタは何も割り当てていません。 –

答えて

1

あなたが入力を保存するためのスペースが必要になります。

char temp[50]; 
printf("Enter Name1: "); 
fgets(temp, sizeof temp, stdin); 
stringLen = strlen(temp) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 
strcpy(namePointer[i]->Name1, temp); 

またはstrdupを使用します(多くの実装上の非標準が、利用可能な)::

char temp[50]; 
printf("Enter Name1: "); 
fgets(temp, sizeof temp, stdin); 
namePointer[i]->Name1 = strdup(temp); 

printf("Enter Name1: "); 
fgets(namePointer[i]->Name1, 50, stdin); /* Name1 is an uninitialized pointer */ 
stringLen = strlen(namePointer[i]->Name1) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 

は中間アレイとstrcpyを使用します

+0

または 'namePointer [i] - > Name1 = strdup(temp);'最後の3行の代わりに – pm100

関連する問題