gpt4 book ai didi

c - C 中学生的单链表,无法从另一个函数中创建的节点访问所有字段

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:15 24 4
gpt4 key购买 nike

我正在尝试为我们学习 C 的类(class)做一个练习。我们必须创建一个 struct STUDENT_RECORD 的单链表。每个学生记录都被设计为单向链表中的一个节点。定义如下:

struct STUDENT_RECORD{
char *name;
float gpa;
int age;
struct STUDENT_RECORD *next;
};

我应该编写的程序接受用户的输入并创建一个单链表。列表中的每个节点都是在运行时根据用户输入创建的。

struct 的字段之一是name。由于我们从一个覆盖存储用户输入名称的 name 变量的循环中接收用户输入,因此我必须复制每个名称,以便将其保存在列表中。

这是我目前所拥有的:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "student.h"

struct STUDENT_RECORD* addNode(char* name, int anAge, float aGPA){
//this is the function that creates the new STUDENT_RECORD and returns a reference to it

//copy the input name in another string
char nameCopy [strlen(name)+1];
int i = 0;
while(name[i] != '\0'){
nameCopy[i] = name[i];
i++;
}
nameCopy[strlen(name)] = '\0';

//create a new node/STUDENT_RECORD
struct STUDENT_RECORD *ttemp = (struct STUDENT_RECORD *)malloc (sizeof(struct STUDENT_RECORD));

//fill the new STUDENT_RECORD with input arguments
ttemp->name = nameCopy;
ttemp->age = anAge;
ttemp->gpa = aGPA;
ttemp->next = NULL;

puts("Test to see if the data is copied right:");
printf("%s, %d, %f\n", ttemp->name, ttemp->age, ttemp->gpa);
return ttemp;
}


int main() {
struct STUDENT_RECORD *head = {"dummy", 0, 0, NULL};
char selection='Y', aName[50], garbage;
int anAge;
float aGPA;
while (toupper(selection) == 'Y') {

// prompt the user for aName[], anAge, and aGPA
puts("Enter the student's name (up to 49 characters), age, and GPA: ");
scanf("%s", aName);
scanf("%d", &anAge);
scanf("%f", &aGPA);


struct STUDENT_RECORD *temp = addNode(aName, anAge, aGPA);
printf("Student created: %s, %d, %f\n", temp->name, temp-> age,temp-> gpa); //prints everything but the student name

printf("Continue? (Y/N): ");
//clear the buffer of the newline from the previous entry newline
garbage = getc(stdin);
scanf("%c", &selection);
}

//printNodes(head);
}

现在,我遇到的众多问题之一是指针 *temp 似乎无法看到 name 字段STUDENT_RECORD 的。我可以毫无问题地从主屏幕查看所有其他屏幕。即,当我尝试打印返回的 STUDENT_RECORD 的所有字段时,我得到了除了名称之外的所有字段。我不明白为什么这不起作用:据我所知,在调用 addNode 函数后,我返回了一个节点的引用,我应该能够打印它的所有字段来自主要的,不是吗?

我确信还有其他问题,但就目前而言,至少能够从主函数访问给定 STUDENT_RECORD 的所有字段是一个好的开始。

谢谢!!

最佳答案

您没有存储名称的副本。您创建了一个本地副本,然后存储了一个指向它的指针,该指针在您的函数返回时变得无效。

这就是为什么您在函数内部的测试没有问题。函数返回后,使用该指针会导致未定义的行为。

使用 malloc 为字符串分配内存:

char *nameCopy = malloc(strlen(name)+1);
if (nameCopy) strcpy(nameCopy, name);

请记住在稍后删除节点时释放此内存。

关于c - C 中学生的单链表,无法从另一个函数中创建的节点访问所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55012337/

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