2016-09-30 15 views
0
struct student{ 
    int id; 
    int score; 
}; 

struct student* allocate(){ 
    struct student* students = (struct student*)malloc(sizeof(struct student)*10); 
    return students; 
} 


void generate(struct student* students){ 
    int i=0; 
    printf("%lu\n", sizeof(students)); 
    printf("%lu\n", sizeof(struct student)); 
    int length = sizeof(students)/sizeof(struct student); 
    printf("%d\n", length); 
    for(i=0;i<length;i++){ 
      printf("hi\n"); 
    } 
} 

私は10の学生構造の配列を作成する必要がありますこのコードを持っています。私が関数を生成して、生徒配列に割り当てられたメモリ量を調べようとすると、8バイトと書かれています。これは単一の学生構造体と同じです。forループに到達すると、それは8回でなければならない。私は何を間違えたのですか?構造体の配列にメモリが正しく割り当てられていませんか?

出力:

8 
8 
1 
hi 
+1

"...学生の配列が割り当てたメモリ量を確認する..."何故、演算子 'sizeof'がその目的に適していると思いましたか? 'sizeof'を使う考えはどうでしたか? – AnT

+1

sizeof(students)は、配列のサイズではなく、ポインタのサイズを指定します。 –

+0

配列のサイズを取得する最も良い方法は何でしょうか? – izzzi

答えて

3

私が間違って何をしましたか?

studentsはポインタなので、sizeof(students)はポインタのサイズを示します。 studentsが指している配列のサイズはわかりません。

でも、sizeof(*students)もうまくいきません。の1つで、という学生のサイズではなく、配列全体のサイズです。これは、studentsがコンパイラに関する限り、最初の生徒を指しているからです。

配列の先頭にポインタを置くと、配列のサイズを取得する組み込みの方法はありません。自分でサイズを把握する必要があります。

関連する問題