如何在c中穿过结构阵列



我有一个程序,该程序创建数组或结构并通过它进行处理。最初,它用定义的元素初始化数组。然后,对于数量的数量元素,分配了名称。

我假装与我的方案相等的代码,该方案在CodeBloc中进行了测试并获得类似的错误。该问题在评论中描述。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _car {
    char *name;
    int year;
} Car;
char *getCarName(char *name, int var);
void processCar();
void printCars(Car car[]);
int INCREMENT = 10;
int main(void)
{
    processCar();
    return 0;
}
void processCar()
{
    // create car array with amount of INCREMENT
    Car CAR_ARRAY[INCREMENT];
    int a=0;
    // This function assign name for Car amount 10 less than INCREMENT
    while (a<INCREMENT - 2) {
        char *carName;
        carName = getCarName(&carName, a);
        CAR_ARRAY[a].name = malloc(strlen(carName) + 1);
        strcpy(CAR_ARRAY[a].name, carName);
        a++;
    }
     printCars(CAR_ARRAY);
}
void printCars(Car car[])
{
    printf("IN Car n");
    int a = 0;
    // when try to call name for car amount equals to INCREMENT program terminates.
    while(a<INCREMENT) {
        if (car[a].name != NULL) // checking if NULL
            printf("Car Name : %d -> %sn", a, car[a].name);
        a++;
    }
}
char *getCarName(char *name, int var)
{
    name = "Toyota";
    return name;
}

检查结构数组中的结构值的正确方法是什么?

编辑

我创建了一个hack来执行此操作。

// added these right after creating array
for (a = 0; a < INCREMENT; a++)
    CAR_ARRAY[a].name = NULL;

我不知道这是否是标准方式。PLS建议。

您在打印之前正在检查NULL,这是一个好主意,但是在这里对您无济于事,因为您的最后两辆汽车是不可初学的,可能包含垃圾:name指针是不是NULL,但也不指向有效的地址。随之而来的分割违规。

您应该初始化所有汽车,而不仅仅是INCREMENT - 2。另外,您可以通过在初始化之前致电memset来初始化汽车至零:

memset(CAR_ARRAY, 0, sizeof(Car) * INCREMENT);

顺便说一句,您处理getCarName的方式也相当动摇。目前,您的名字是字符串文字的指针。您的本地变量carName履行双重双重责任:您尝试通过参考(但实际上您没有)将其传递。

基本上,您可以通过两种方式之一进行此操作。这里更容易返回指针。在这种情况下,您不必传递任何字符串:

char *getCarName(int var)
{
    static char *names[3] = {"Toyota", "Dodge", "Peugeot"};
    return names[var % 3];
}

并将其称为:

char *carName = getCarName(&carName, a);    

另外,您可以通过引用传递char指针,即作为指向CHAR指针的指针。在这种情况下,您不必返回任何东西:

void getCarName(char **name, int var)
{
    static char* names[3] = {"Toyota", "Dodge", "Peugeot"};
    *name = names[var % 3];
}

这样称呼:

char *carName;
getCarName(&carName, a);

这里还有其他场景,例如,如果您只通过炭指针并让getCarName填充它,但是我现在就离开了 - 它会使一切变得更加复杂。

相关内容

  • 没有找到相关文章

最新更新