c语言中结构的传递指针
我需要将指针传递给函数,但它不工作的输出是空的 我一周前在我的大学里学习过这个指针,但它非常混乱 谢谢你的预付款 下面的代码和输出:c语言中结构的传递指针,c,C,我需要将指针传递给函数,但它不工作的输出是空的 我一周前在我的大学里学习过这个指针,但它非常混乱 谢谢你的预付款 下面的代码和输出: #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo{ char CourseID[10]
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo{
char CourseID[10];
char CourseName[50];
float score;
struct Nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo *next;
}course;
void GetData(course *newnode,course *root,course *last)
{
char CourseID[10],CourseName[50];
float score;
FILE *input;
input = fopen("Course.txt","r");
fscanf(input,"%s %s %f",&CourseID,&CourseName,&score);
while(!feof(input))
{
newnode = (course*)malloc(sizeof(course));
strcpy(newnode->CourseID,CourseID);
strcpy(newnode->CourseName,CourseName);
newnode->score = score;
newnode->next = NULL;
if(root == NULL)
{
root = newnode;
last = newnode;
}
else
{
last->next = newnode;
last = newnode;
}
fscanf(input,"%s %s %f",&CourseID,&CourseName,&score);
}
}
void checkScore(course *run,course *root)
{
run = root;
while(run != NULL)
{
if(run->score >= 80)
{
printf("Course ID = %s\n",run->CourseID);
printf("Course Name = %s\n",run->CourseName);
printf("Your grade of this Course is = ");
if(run->score < 50)
{
printf("D");
}
else if(run->score < 60)
{
printf("C");
}
else if(run->score < 70)
{
printf("B");
}
else
{
printf("A");
}
}
run = run->next;
}
}
int main()
{
course *root = NULL,*last,*newnode,*run;
int i,cnt;
GetData(newnode,root,last);
checkScore(run,root);
return 0;
}
#包括
#包括
#包括
类型定义结构nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo{
char-CourseID[10];
char CourseName[50];
浮点数;
结构nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo;
}课程;
void GetData(课程*newnode,课程*root,课程*last)
{
char CourseID[10],CourseName[50];
浮点数;
文件*输入;
输入=fopen(“Course.txt”,“r”);
fscanf(输入,“%s%s%f”、&CourseID、&CourseName、&score);
而(!feof(输入))
{
newnode=(课程*)malloc(sizeof(课程));
strcpy(newnode->CourseID,CourseID);
strcpy(newnode->CourseName,CourseName);
新建节点->得分=得分;
newnode->next=NULL;
if(root==NULL)
{
根=新节点;
last=newnode;
}
其他的
{
last->next=newnode;
last=newnode;
}
fscanf(输入,“%s%s%f”、&CourseID、&CourseName、&score);
}
}
无效检查分数(课程*运行,课程*根)
{
运行=根;
while(run!=NULL)
{
如果(跑步->得分>=80)
{
printf(“课程ID=%s\n”,运行->课程ID);
printf(“课程名称=%s\n”,运行->课程名称);
printf(“您的本课程成绩为=”);
如果(跑步->得分<50)
{
printf(“D”);
}
否则如果(运行->分数<60)
{
printf(“C”);
}
否则如果(运行->分数<70)
{
printf(“B”);
}
其他的
{
printf(“A”);
}
}
运行=运行->下一步;
}
}
int main()
{
课程*root=NULL,*last,*newnode,*run;
inti,cnt;
GetData(newnode、root、last);
检查分数(运行,根);
返回0;
}
这是输出
首先,这个问题看起来相当可笑,尤其是结构名为“noooooooooooooo”的情况下,可能是在浪费人们的时间来回答 其次,你的术语太离谱了。向结构传递指针与向函数传递指针是非常不同的 但是,在代码中,主要问题是这一行:
void GetData(course *newnode,course *root,course *last)
你真的知道这里有什么吗?你有3个本地指针,当你的程序启动时,它们都是空的或未初始化的。然后在您的函数中,使用malloc()调用一些ram,并使用这些本地指针存储分配的内存块的地址。但是,您似乎不明白这些是您传入的指针的本地副本,因此当您的函数结束时,它们将在堆栈展开时消失
如果要返回分配给调用函数的内存地址,则需要传递指针的地址,然后使函数进行双解引用
像这样的
course *c;
GetData(&c);
void GetData(course **c)
{
*c = (course*)malloc(sizeof(course));
...
...
}
不要发布文本图像!搜索并阅读如何在c中模拟按引用传递[sigh]“GetData(newnode,root,last);”无法更改“root”的值。当初始化时,它将永远是空的。C标记上的每一个链表问题都有这个问题,并且有数千个问题:(更糟糕的是,通过最简单的调试,可以很容易地发现永不改变的头/根):(非常感谢,我可以修复它。对不起,我的名字是sturct。我在这里建议的另一件事是更改GetData函数。我个人认为,让函数返回指向已分配内存块的指针是个坏主意,因为你可能会忘记函数已为你分配了内存,如果你忘记释放它,你就有了内存leak、 我认为与其在GetData()函数内部分配内存,不如在外部分配内存,并将指针传递给GetData()函数,该函数将用数据填充结构。