我有两个简单的结构,在我的主要创建中:
struct Car *myCar[200]
struct Car *otherCar[200]
当我第一次尝试初始化它们时,我尝试了:
for (int i = 0; i < 200; i++){
myCar[i] = malloc(sizeof(struct Car*));
otherCar[i] = malloc(sizeof(struct Car*))
}
哪个不起作用。但如果我将它们拆分成单独的循环,如:
for (int i = 0; i < 200; i++){
myCar[i] = malloc(sizeof(struct Car*));
}
for (int x = 0; x < 200; x++){
otherCar[x] = malloc(sizeof(struct Car*))
}
它有效。有人可以向我解释为什么它在每个例子中都不起作用吗?
答案 0 :(得分:5)
如果目标指针具有struct Car *
类型,则很可能每次调用malloc
都应该为单个struct Car
对象分配足够的内存。这意味着您分配的每个内存块的大小应为sizeof(struct Car)
,而不是代码中的sizeof(struct Car *)
。
这两个变种都存在这个问题,这意味着如果第二个变种“有效”,那就是纯粹的意外。
一般来说,一个好主意是坚持以下习语
for (int i = 0; i < 200; i++){
myCar[i] = malloc(sizeof *myCar[i]);
otherCar[i] = malloc(sizeof *otherCar[i]);
}
即。只需在收件人指针前添加一个*
,然后在sizeof
中使用它。这样您就不必计算*
并担心sizeof
下要使用的特定类型。
答案 1 :(得分:0)
sizeof(struct Car*)
这个陈述意味着指针4或8的大小取决于系统,因此在你的第二个选项中,如果它正在工作那么它就是m / c运气。
你需要在两个变种中使用b3low来改变它
sizeof(struct Car);