繁体   English   中英

同一循环内的Malloc

[英]Malloc within same loop

我主要使用以下两个简单的结构创建它们:

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*))
}

有用。 有人可以向我解释为什么在每个示例中都行不通吗?

如果目标指针具有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使用它。 这样,您就不必计算* s,而不必担心在sizeof下使用的特定类型。

sizeof(struct Car*)

该语句表示指针4或8的大小(取决于系统),因此在第二种选择中,如果它正在工作,则说明运气好。

您需要在两个变体中都使用b3low对其进行更改

sizeof(struct Car);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM