我已经以这种方式设置了结构。 当我打印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;
}
答案 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