gpt4 book ai didi

c - 如何遍历C中的Struct数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:52 25 4
gpt4 key购买 nike

我有一个程序可以创建一个数组或结构并通过它进行处理。最初它用定义的元素数初始化数组。然后为数组中的一些元素分配名称。

我假设代码与我在 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 -> %s\n", a, car[a].name);
a++;
}
}

char *getCarName(char *name, int var)
{
name = "Toyota";
return name;
}

检查struct array 上的struct 值是否可以调用的正确方法是什么?

编辑

我创建了一个 hack 来执行此操作,如下所示。

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

我不知道这是否是一种标准方式。请指教。

最佳答案

您在打印前检查 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 填充它,但我暂时不考虑 - 这会使一切变得更加复杂。

关于c - 如何遍历C中的Struct数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22346346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com