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

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中使用它。这样,您不必计算*,而不必担心sizeof下要使用的特定类型。

关于c - 同一循环内的Malloc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40850781/

10-15 16:47