2012-12-01 59 views
2

我正在爲我的基本C分配製作鏈表程序。 但是,我總會在.exe上得到強制關閉錯誤,並在Ubuntu上得到分段錯誤。簡單鏈接列表C代碼分段錯誤

我試圖分解並重寫,但我不知道代碼失敗的地方。

我很感謝您的幫助。

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


    struct node{ 
      char name[20]; 
      int mark; 
      struct node *next; 

    }; 

    struct node *addnode(char name[], float mark); 


    int main(void){ 

      int j = 0; 
      char StdName[10]; 
      float StdMarks; 

      struct node *head = NULL; 
      struct node *curr = NULL; 

      head = curr = addnode('\0',0.0); 

      for(j=0; j<3; j++){ 

        printf("\nEnter StdName >>"); 

        printf("\nMarks for %s >>", StdName); 


        curr -> next = addnode("", 5.5); 
        curr = curr->next; 
      } 

      curr = head -> next; 

      j = 0; 

      printf("\nnode\tName\tMarks"); 

      while(curr){ 

        printf("\n%d\t%s\t%5.2f", j++, curr->name, curr->mark); 
        curr=curr->next; 
      } 

    return 0; 

    } 

    struct node *addnode(char name[], float mark){ 

      struct node *temp; 

      temp=(struct node*)malloc(sizeof(struct node)); 
      strcpy(temp->name,name); 
      temp->mark=mark; 
      temp->next=NULL; 

    return (temp); 
    } 
+0

考慮使用調試器?嘗試尋找'gdb' – axiom

回答

1

一些錯誤:

  • '\0'不是char[],而是一個char,其值是0並轉換成char*NULL指針)。使用""作爲空字符串。編譯器應該發出警告。在最高級別編譯警告級別並將警告視爲錯誤(因此您不能忽略它們)。對於gcc的標誌是-Wall -Werror
  • StdName未初始化,永遠不會被填充,但用於調用printf("%s")
+0

謝謝!這工作:) –

+0

@AminHusni如果這回答你的問題,你應該接受它:) – iabdalkader

+0

對不起,我有點新在這裏。 –

1

的第一個節點添加您使用單個字符'\0'的名字,當你要傳遞一個字符串:

head = curr = addnode("", 0.0); 

而且也並不指向第一個節點,它指向第二個:

curr = head -> next; 

應該是:

curr = head; 

我不知道你打算用StdName做什麼,但正如hmjd所說,它應該初始化爲一些值。

char StdName[] ="stdname"; 
+0

好的,代碼工作。這是 head = curr = addnode(「」,0.0);問題。 謝謝:) http://pastebin.com/6GreaqTv –

0

head = curr = addnode('\0',0.0);行無效。你的addnode函數期望一個指向字符數組的指針作爲第一個參數。 '\0'是一個等於0的整數值。您將name傳遞給strcpy,將其用作指向源數據的指針。由於指針是0(== NULL),所以會發生崩潰。