2017-01-23 20 views
1

私はC言語ではかなり新しく、構造体の配列に連続したメモリを割り当てる方法を理解するのに問題があります。この割り当てでは、コードのシェルが与えられ、残りの部分を埋める必要があります。したがって、変数名や関数プロトタイプを変更することはできません。これは私に与えられたものです:構造体の配列に動的にメモリを割り当てる方法

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

struct student { 
    int id; 
    int score; 
}; 

struct student *allocate() { 
    /* Allocate memory for ten students */ 
    /* return the pointer */ 
} 

int main() { 
    struct student *stud = allocate(); 

    return 0; 
} 

私は、これらのコメントがallocate関数で何を言っているのかについてはわかりません。

struct student *allocate(void) { 
    /* Allocate and initialize memory for ten students */ 
    return calloc(10, sizeof(struct student)); 
} 

注:

+0

より良いコースをお試しください。関数シグネチャは推奨されず、将来の標準から削除されます。プロトタイプスタイルを使用します(例: 'int main(void)'です。 – Olaf

答えて

6

割り当て、配列を初期化する最も簡単な方法は、これをあるmalloc()は異なり

  • calloc()は、すべてのビットがゼロにメモリブロックを初期化します。したがって、配列のすべての要素のフィールドidscore0に初期化されます。
  • 関数の引数として学生の数を関数allocate()に渡すことをお勧めします。
  • 不要になったメモリはfree()に割り当てられたメモリには良いスタイルと見なされます。あなたのインストラクターは、main()から戻る前にfree(stud);に電話する必要があるとは思わなかった:厳密には必要ではないが(プログラムによって割り当てられたすべてのメモリは、プログラム終了時にシステムによって再利用される)、それは習慣がよく、大きなプログラムではメモリリークが発生する。
+0

インストラクターが故意に 'free()'の呼び出しをやめたかどうか疑問に思います... – stevieb

+1

@stevieb:良い点、私はこの点についてメモを付けました。 – chqrlie

+0

'void * calloc(size_t nmemb、size_t size);のC仕様のスタイルに従うために' calloc(10、sizeof(struct student)) 'を使用してください。 – chux

関連する問題