sizeof结构和嵌套结构

时间:2017-08-26 22:43:42

标签: c

我已经以这种方式设置了结构。 当我打印sizeof(DATA)时,我得到16.为什么它是16?我认为idx为8,而ptr为4。

我为STUDENT结构和大小为50的STATS结构数组分配内存。我是否分配了足够的内存?

typedef struct {
    int idNum;
    int classNum;

} STATS;
typedef struct {
    STATS * stats;
    int currGrade;

}STUDENT;

typedef struct {
    STUDENT * ptr;
    int idx;

} DATA;

//student_main.c
void function1()
{
    DATA d;
    func(&d);
}
//student.c
void func(DATA * d)
{
    Student * s = malloc(sizeof(STUDENT));
    d->ptr = s;
    d->ptr->currGrade = 1;

    STATS * arr = malloc(sizeof(STATS)* 50);
    d->ptr->stats = arr;
    d->ptr->stats[0].idNum = 1;
    d->ptr->stats[0].classNum = 1;
}

3 个答案:

答案 0 :(得分:2)

  

我已经以这种方式设置了结构。当我打印sizeof(DATA)时,我   得到16.为什么是16?我认为idx为8,而4为4   ptr。

因为编译器(可能)在struct元素之间/之后添加填充以满足对齐约束。您可以阅读有关data structure alignment here的内容。

DATA的情况下,其16B因为(如果您的机器是x64)

typedef struct
{
    STUDENT * ptr;    // 8B pointer
    int idx;          // 4B int
                      // 4B padding
} DATA;
  

我为STUDENT结构和STATS结构数组分配内存   大小50.我分配了足够的内存吗?

这取决于您的需求。您已为50个结构分配了足够的空间。请记住在分配动态内存时始终使用sizeof(type)

答案 1 :(得分:1)

编译器将 pad 结构,例如,允许更快地访问64位架构中的后续元素。

编译器处理它时,您不必担心@customer = self 大小的数值。仅用于比较,并忽略绝对值(除非您的爱好是对编译器进行逆向工程)

答案 2 :(得分:0)

出于两个原因之一,它可能是16 - 要么你有32位机器,编译器会增加一些"空间"在您的结构中,使操作更快。如果希望结构具有确切的大小,则可以通过向结构定义添加malloc(x * sizeof(struct xxx))来停止此行为。或者你有64位机器,64位指针和整数。或两者兼而有之。

您已分配足够的内存。做this.sendMovieTitleToAPI = this.getMovieInformation.bind(this);会给你信心。

我建议您阅读这篇优秀的文章:The Lost Art of C Structure Packing