如果你想让每只狗都能进行一次以上的检查,那么你就需要做更多的工作。
我在访问包含在dog中的检查结构时遇到了一些麻烦。由于狗被包含在包含中,我假设我只会指向从容器中的狗的检查,但这似乎会在尝试添加检查日期或替换一个时导致错误。
// used to create a linked list of containers, each contaning a "dog"
struct container {
struct dog *dog;
struct container *next;
} *list = NULL;
// used to hold dog information and linked list of "checkups"
struct dog {
char name[30];
char breed[30];
struct checkup *checkups;
};
// used to create a linked list of checkups containing "dates"
struct checkup {
char date[30];
struct checkup *next;
};
这里是代码,我试图添加一个新的日期到检查,但当它试图添加它在我的程序崩溃。如果你能告诉我为什么会这样,我将不胜感激。
void add_checkup(char* name, char* date)
{
struct container *tempList = list;
struct checkup *tempCheck = (struct checkup *) malloc(sizeof(struct checkup));
while (tempList != NULL) {
if (strcmp(tempList->dog->name, name) == 0) {
strcpy(tempCheck->date, date);
strcpy(tempList->dog->checkups, tempCheck);
}
tempList->next;
}
}
为什么使用strcpy()
来设置struct checkup *
的值?它试图将源指针指向的数据复制到假定目标指针指向的数组中,而事实上,我认为没有特别的理由假设目标指针是有效的。当然,没有理由假设源数据具有char
的空终止数组的形式,因此您的原始代码在这里是严重错误的。
简单赋值更可能是正确的:
tempList->dog->checkups = tempCheck;
但是,请注意,这会带来严重的内存泄漏风险,因为tempList->dog->checkups的前一个值会丢失。还要注意,它与函数名的 add_
部分所暗示的行为不匹配——它更像set_
。