2016-11-28 2 views
-1

У меня есть два простых структур, которые в моей основной я создаю с:Malloc в одной петле

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

это работает. Может ли кто-нибудь объяснить мне, почему это не работает/не работает в каждом примере?

+2

Что не работает в виду? –

+1

вам не хватает точки с запятой ... и зачем выделять, когда вы можете сделать 'struct Car myCar [200];'? и это должно работать так [изменить] ваш вопрос, чтобы объяснить, что пойдет не так. –

+1

Определить «не работает»? Также вы выделяете неправильный объем памяти. В ваших массивах содержатся указатели на 'struct Car', но вы выделяете достаточно для указателя, который, вероятно, не является размером структуры. –

ответ

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.

0
sizeof(struct Car*) 

это утверждение означает, что размер указателя 4 или 8 в зависимости от системы, поэтому в вашем втором варианте, если он работает, то это сущее м/с везением.

вам нужно изменить его с b3low в обоих вариантах

sizeof(struct Car); 
Смежные вопросы