2016-02-22 65 views
-6

我需要將指針傳遞給函數,但它不起作用輸出爲空。在c編程中傳遞結構指針

我在1周前在我的大學學習這個指針,但它很混亂。

謝謝你的提前。

下面的代碼輸出:

#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; 
} 

這是輸出

This is out put

+0

請勿張貼文字圖片! – Olaf

+1

搜索並閱讀有關如何在c *中模擬按引用傳遞的信息。 –

+0

[嘆氣]'GetData(newnode,root,last);'不能可靠地改變'root'的值。如初始化,它將永遠爲NULL。 –

回答

1

首先,這個問題顯得頗爲可笑,特別是隨着 「Nooooooooooooooooooooooo」 一個結構的名稱,它可能是一種浪費的人試圖回答。其次,你的術語是不對的。傳遞指向結構的指針與指向函數的指針非常不同!

然而,在你的代碼中,主要問題是這一行:

void GetData(course *newnode,course *root,course *last) 

你真的知道你有什麼嗎?那麼,你有3個本地指針,當你的程序啓動時,這些指針都是空的或未初始化的。然後在你的函數中,你malloc()一些內存,並使用這些本地指針來存儲這個分配的內存塊的地址。但是,您似乎並不明白這些是您傳入的指針的本地副本,所以當函數結束時,堆棧展開時它們將消失。

如果你想要返回你分配給調用函數的內存地址,你需要傳遞指針的地址,然後讓你的函數得到一個雙重解引用。

事情是這樣的......

course *c; 

GetData(&c); 

void GetData(course **c) 
{ 
    *c = (course*)malloc(sizeof(course)); 
    ... 
    ... 
} 
+0

非常感謝你我可以修復它。對不起,我的名字爲 –

+0

我在這裏推薦的另一件事是改變你的GetData函數。認爲有一個函數返回一個指向已分配內存塊的指針是一個糟糕的主意,因爲你可能忘記了該函數已經爲你分配了它,如果你忘記釋放它,你就會發生內存泄漏。如果不是在GetData()函數內部分配內存,而是在外部分配它並將指針傳遞給GetData()fun這將用數據填充結構。 –