Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中结构的传递指针_C - Fatal编程技术网

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()函数,该函数将用数据填充结构。