2016-01-02 61 views
-2

我不知道爲什麼我的程序在向函數傳遞字符串時崩潰。我非常喜歡它應該工作。 :/c:將字符串傳遞給函數失敗

void add_person(node **head, char name[MAXDL], char surn[MAXDL]); 

int main() 
{ 
int i; 
char nm[MAXDL], sn[MAXDL]; 
node **head = NULL; 
for (i = 0; i < 3; i++) 
{ 
    scanf("%s", nm); 
    scanf("%s", sn); 
    add_person(*head, nm, sn); //IN THAT LINE THE PROBLEM OCCURS 
} 
//... 

system("PAUSE"); 
return 0; 
} 


void add_person(node **head, char name[MAXDL], char surn[MAXDL]) 
{ 
//body 
} 

該計劃的目的是創建一個列表,並添加三個人吧。 我已經評論了這條線,哪裏不對。 調試器: 「異常在ConsoleApplication2.exe在0x00D91A54拋出:0000005:訪問衝突讀取位置00000000

如果這個異常的處理程序,該程序可以安全地繼續下去。」

那麼,我真的不知道那裏出了什麼問題。 :(

+2

請提供[MCVE(集中在 「最小」)。和「我的程序崩潰」是沒有**具體**問題的描述。使用調試器。 – Olaf

+4

'glowa'包含NULL,並且您正嘗試使用'* glowa'。崩潰與字符串無關。 – immibis

+0

「調試器:」ConsoleApplication2.exe中的0x00D91A54引發的異常:0xC0000005:訪問衝突讀取位置0x00000000「看起來不像調試器消息如果不知道調試器是什麼,請搜索該術語 – Olaf

回答

2

有以下改動嘗試。

void add_person(node **head, char name[MAXDL], char surn[MAXDL]); 

int main() 
{ 
int i; 
char nm[MAXDL], sn[MAXDL]; 
node *head = NULL; // <-------------- **head -> *head 
for (i = 0; i < 3; i++) 
{ 
    scanf("%s", nm); 
    scanf("%s", sn); 
    add_person(&head, nm, sn); <----------- *head -> &head 
} 
//... 

system("PAUSE"); 
return 0; 
} 


void add_person(node **head, char name[MAXDL], char surn[MAXDL]) 
{ 
// assuming that you will allocate node in this function like so 
*head = malloc(sizeof(node)); <------------- allocation here? 
} 
+0

void add_person節點**頭,字符名稱[MAXDL],char surn [MAXDL])<--------------不應該改變**頭到頭在這裏以及呢? –

+1

不需要。因爲函數需要傳遞'node **','&head'是'node **'。 – Ziffusion

0

分配headNULL然後取消引用。這導致崩潰。你可以只通過在head而不是*head,它不會崩潰。不過,你會傳遞NULL,我想象不你正在嘗試做的。

NULL是0x00000000地址,這就是爲什麼它說你想讀00000000。你永遠要做到這一點。

0

沒有看到的add_person身體,嘗試:

  1. 變化node **head = NULL;node *head = NULL;
  2. 變化add_person(*head, nm, sn);add_person(&head, nm, sn);
相關問題