2015-04-27 2 views
0

Мне нужно сделать программу, которая может зарегистрировать некоторую машину. Тогда мне нужно показать все регистрации автомобилей.Как использовать указатель в указателе с Struct и указателем в C

Я не могу сделать эту работу, когда я выполняю код ниже printf, покажу только мусор памяти, и только последний автомобиль появится правильно!

кода (у меня есть функция меню, вызова других):

int id = 0; 

struct car { 

    char brand[50]; 
    char model[50]; 

}; 
car *garage = 0; 
int doCar(){ 

    garage = (struct car *)malloc(sizeof(struct car*)); 
    printf("\n Insert the model: \n\n"); 
    fflush(stdin); 
    fgets(garage[id].model, 50, stdin); 
    id++; 

} 

int ShowCars(){ 

    int i = 0; 

    while (i < id) { 

     printf("aqi= %s \n", garage[id].model); 
     i++; 

    } 

} 
+0

Я также пытаюсь использовать Realloc, но всегда появляется та же ошибка. –

+0

'автомобиль * garage = 0;' -> 'struct car * garage = 0;' и 'garage = (struct car *) malloc (sizeof (struct car *));' -> 'garage = (struct car *) malloc (sizeof (struct car)); 'и remove' fflush (stdin); ' –

+0

Это не совсем C++ вообще – dwcanillas

ответ

0

Рассмотрим следующий пример:

#include <stdio.h> 
#include <stdlib.h> 

struct car { 

    char brand[50]; 
    char model[50]; 

}; 

// dlobal variables 
car* garage = NULL; 
int cnt = 0; 

void doCar(){ 
    // add counter 
    cnt++; 
    // add memory 
    garage = realloc(garage, sizeof(car) * cnt); // NOTE: not malloc 
    printf("Enter the brand: "); 
    scanf("%49s", garage[cnt - 1].brand); // or fgets 
    printf("Enter the model: "); 
    scanf("%49s", garage[cnt - 1].model); // or fgets 
} 

void ShowCars(){ 
    int i; 
    for(i = 0; i < cnt; i++) 
    { 
     printf("%s %s\n", garage[i].brand, garage[i].model); 
    } 
} 

EDIT:

Добавить функцию main для проверки:

int main(int argc, char* argv[]) 
{ 
    // test for three cars 
    doCar(); 
    doCar(); 
    doCar(); 
    ShowCars(); 

    // free memory after using 
    free(garage); 
    return 0; 
} 
+0

Я не знаю, почему, но если я использую printf в функции ** doCar **, отлично работает, но когда я пытаюсь вызвать функцию ** ShowCars **, не показывайте notting –

+0

@JuniorBarros: Возьмите весь мой код с основной функцией – VolAnd

+0

Я удаляю весь свой код и использую ваш и отлично работаю. Благодаря! –

0

В функции ShowCars, линия printf("aqi= %s \n", (*garage + id).model); вы разыскиваете гараж и добавляете id к этой структуре, что не должно иметь смысла. Ты лучше заменить, что с garage[i] нотации, что вы были раньше, так как это:

printf("aqi= %s \n", garage[i].model); 

Кроме того, как кто-то еще упоминалось ранее, вам необходимо выделить новый автомобиль sizeof(struct car) (который будет 50 + 50 = 100) и НЕ sizeof(struct car *) (что, скорее всего, в вашей системе 4 для 32-битного размера указателя). Наконец, каждый раз, когда вы создаете новый автомобиль, вам нужно увеличить гараж, чтобы указать на эти распределения. Удачи!