我有一个程序,该程序创建数组或结构并通过它进行处理。最初,它用定义的元素初始化数组。然后,对于数量的数量元素,分配了名称。
我假装与我的方案相等的代码,该方案在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
填充它,但是我现在就离开了 - 它会使一切变得更加复杂。