如何在C中使用带有Struct和指针的指针中的索引

时间:2015-04-27 14:31:11

标签: c pointers struct malloc realloc

我需要制作一个可以注册汽车的程序。 然后我需要显示所有汽车登记。

我无法完成这项工作,当我执行printf show下面的代码只是内存垃圾,而最后一辆车就出现了!

代码(我有一个调用其他功能的菜单功能):

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++;

    }   

}

2 个答案:

答案 0 :(得分: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);
    }
}

修改

main函数添加到test:

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

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

答案 1 :(得分: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位指针大小)。最后,每次创建新车时,您都必须增加车库以指向这些分配。祝你好运!