2014-11-02 38 views
-2

這是一段代碼,如果我使用gcc編譯器運行這段代碼,我會得到段錯誤。實際上是什麼以及它爲什麼會發生在這段代碼中。獲取輸入到數組的分段錯誤

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 
struct node 
{ 
    int number; 
    struct node *right; 
    struct node *left; 
}; 
void funct(struct node *root,int num,int counter,int limit,int *arr) 
{ 
    if(root==NULL) 
    { 
    root=malloc(sizeof(struct node)); 
    } 

    if(counter>=limit) 
    { 
     root->left=NULL; 
     root->right=NULL; 
     return; 
    } 
    root->number=num; 
    counter++; 
    funct(root->left,num+arr[0],counter,limit,arr); 
    funct(root->right,num+arr[1],counter,limit,arr); 

} 
void getdata(struct node *root,int *res,int counter) 
{ 
    while(root->left!=NULL&&root->right!=NULL) 
    { 
     getdata(root->left,res,counter); 
     getdata(root->right,res,counter); 
    } 
    res[counter]=root->number; 
} 
int main() 
{ 
    int t,i,n,arr[2],*res,size,j; 
    scanf("%d",&t); 
    j=0; 
    while(j++<t) 
    { 
    scanf("%d",&n); 
    scanf("%d %d",&arr[0],&arr[1]); 
    size=pow(2,n-1); 
    res=malloc(size*sizeof(int)); 
    if(res==NULL) 
    { 
     printf("you got this one"); 
    } 
    struct node *root=NULL; 
    funct(root,0,0,n,arr); 
    getdata(root,res,0); 
    for(i=0;i<size;i++) 
    { 
     printf("%d\t",res[i]); 
    } 
    } 
    return 0; 
} 

在這裏,我使用gcc編譯器上ubuntu.I試圖追查問題,認爲有一些問題,在scanf ARR輸入。

+2

1.縮進代碼。 2.使用調試器查找分段錯誤的位置 – 2014-11-02 06:57:46

+1

使用gdb等調試器,查看分段錯誤發生的位置以及原因。 – Rohan 2014-11-02 06:57:50

+0

你在哪裏分配'root'?什麼是'func'和'getdata'? 「尋求調試幫助的問題(」爲什麼這個代碼不工作?「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。給其他讀者,參見:[**如何創建一個最小,完整和可驗證的示例**](http://stackoverflow.com/help/mcve)。「 – 2014-11-02 07:30:56

回答

4

您正在使用malloc的退貨而未檢查失敗。如果size = pow(2, n-1)太大,則malloc將失敗並返回空指針。解引用空指針通常會導致段錯誤。錯誤檢查示例:

res=malloc(size*sizeof(int)); 
if(res){ 
struct node *root=NULL; 
funct(root,0,0,n,arr); 
getdata(root,res,0); 
} 
else {//handle error} 
+0

@ user2738777請詳細說明。你想做什麼?你未能達到什麼樣的價值? – Pradhan 2014-11-02 07:24:09

+0

在我使用的測試用例中,n的大小是3和4.我也檢查malloc是否返回null,但它沒有返回NULL值。 – user2738777 2014-11-02 07:29:20