2016-12-07 6 views
1

私のstudentContent変数にメモリを割り当てる方法を理解するのは苦労しています。構造体変数のメモリを割り当てる方法

struct contactInfo { 
    char Name[101]; 
    char Assignment[101]; 
    char MarkDescription[101]; 
    char feedBack[12][101]; 

}; 
struct contactInfo studentContent 

私は構造体変数のためのメモリを割り当てるためにmalloc()を使用したいです。構造体が塗りつぶされた後、私はメモリを再割り当てしたいので、必要なだけ各フィールド内に多くのスペースを利用しています。

+0

なぜ2つの構造体にスペースを割り当てていますか?内容のサイズが違うと言ったらどういう意味ですか?どうして? –

+0

申し訳ありません、多分私は間違いを犯しました。私は1つの構造体のためのスペースを割り当てたい。内容はループ毎に異なるでしょう。私は、各行を構造体内のその尊重されたフィールドに格納するファイルをループしています。私はすべてのフィールドを埋めるした後、私は別の順序でそれらの内容をファイルに書き込みます。私のループはファイルの読み込みを続け、構造体に次のデータセットを格納して、2回目のフィールドのサイズが異なるようにします。 – bodotheguy

+0

構造体の要素のサイズを変更することはできません。彼らは常に彼らが宣言されたサイズになります。それらの配列に読み込んだ文字列が配列のサイズより小さければ、それは問題ありません。あなたはそれについて何もする必要はありません。 –

答えて

1

最初の割り当てでは、ローカル変数studentContentのアドレスにptrが設定されますが、次の行が上書きされます。 ptrを、struct contactInfoの2つのインスタンスのためのスペースを持つ動的に割り当てられたバッファを指すように変更します。あなたは、あなたがn * sizeof *ptr、どこのサイズでreallocptrを渡す移入するstruct contactInfoの複数のインスタンスを持っているように

何をしたい場合は、配列struct contactInfoを持っており、その配列の上昇の要素の数を持つことですnは配列内の要素の数です。あなたは(あなたの元のコードにstudentContentstruct contactInfoのインスタンスを宣言する必要はありません

struct contactInfo *tmp_ptr = realloc(ptr, n * sizeof *ptr); 
if (tmp_ptr == NULL) { 
    perror("realloc failed"); 
    exit(1); 
} 
ptr = tmp_ptr; 

注、1への単なるポインタ。

EDIT:

あなたのコメントに基づいて、あなただけの時間にデータの1つのチャックを読み書きするために移入するために単一のインスタンスを必要とするので、あなたが動的なメモリ割り当てを使用する必要はありません。単一のインスタンスを宣言し、そのたびに内容を上書きしてください。

+0

私はそれが必要ではないことを知っていますが、私のフィールドの1つが半分にしか満たされていないchar配列[101]であるとします。私はそのフィールドを必要な正確なサイズにスリムにしたい。私は必要なだけ多くのスペースを取りたいです。練習のため。 – bodotheguy

+0

私はまだそこにいませんし、おそらく別の質問ですが、私は1つのchar [101]を指すことができるようにすべてのフィールドポインタを作成したいと考えています。 – bodotheguy

+0

[50]までのデータを入力すると、[50]までしか使用しないようにしてください。それは理にかなっていますか? – bodotheguy

関連する問題