-1

私はC言語を勉強していて、構造体についていくつか学ぼうとしています。以下にこの例を示し、構造体のメモリ割り当てがどのように構成されているかを確認しようとしています。構造体のすべてのフィールドが単語化されているため、十分なメモリが使用されていない場合は、例に示されているはずの空のメモリスペースがありますが、コンパイラは、型指定子がない期待される'、および型のようないくつかのエラーを返します。名前は指定子または修飾子を必要とします。どうして?

#include <stddef.h>
#include <stdio.h>

typedef struct
{
    char name[25];
    int id;
    int year;
    char material;
} Student;

int
main(void)
{
    Student talu;
    printf("Size of tAlu %d\n", (int)sizeof(talu));
    printf("name size is %d\n", offsetof(talu, name));
    printf("id size is %d\n", offsetof(talu, id));
    printf("year size is %d\n", offsetof(talu, year));
    printf("material size is %d\n", offsetof(talu, material));
    return 0;
}
4

5 に答える 5

3

閉じ括弧を忘れたためです。

char name[25];
//         ^^^   !
于 2012-11-23T20:00:12.607 に答える
3

ブラケットを逃しました。

 char name[25;

する必要があります char name[25];

于 2012-11-23T20:00:31.197 に答える
1

また、コードをコンパイルしようとしてエラーが発生したため、次のように修正しました。

#include <stddef.h>
#include <stdio.h>

typedef struct
{
    char name[25];
    int id;
    int year;
    char material;
} Student;

int
main(void)
{
    printf("Size of tAlu %d\n", (int)sizeof(Student));
    printf("name size is %d\n", offsetof(Student, name));
    printf("id size is %d\n", offsetof(Student, id));
    printf("year size is %d\n", offsetof(Student, year));
    printf("material size is %d\n", offsetof(Student, material));
    return 0;
}

これは、コンパイラとしてGCCを使用する場合です。

于 2012-11-23T20:08:13.590 に答える
0

offsetof()メンバーのオフセットが最初のパラメータとして計算されるタイプを取ります。

マニュアルページを読むと役立ちます。

于 2012-11-23T20:13:10.743 に答える
0

OFFSETOF(3): "マクロ offsetof() は、構造体タイプの先頭からのフィールドメンバーのオフセットを返します。"

フィールドのサイズは報告されませんが、構造内に配置される位置が報告されますoffsetof()

「構造を構成するフィールドのサイズは実装によって異なる可能性があり、コンパイラーはフィールド間に異なる数のパディングバイトを挿入する場合があります」。

于 2012-11-23T20:25:11.080 に答える