2011-12-01 40 views
1

我寫了一段代碼,我試圖將一個列表傳遞給一個指針數組,但我的指針是空值。我從main調用函數,就像你可以在底部看到的一樣,我試圖用列表填充每個指針(termatika[j]),但是當我要打印它時,我會得到空值。如何傳遞一個指針數組中的列表

struct str { 
    char mitermatika[61]; 
    struct node *termatika[10]; 
} pinakas[100]; 

struct node { 
    char terminalc[61]; 
    struct node *next; 
}; 

void add(struct node *ptr,char buffer[]) 
{ 
    ptr = (struct node *) malloc(sizeof(struct node)); 
    strcpy(ptr->terminalc, buffer); 
    ptr->next=root; 
    root=ptr; 
} 

void terminal(char buffer[],struct node *pointer) { 
    initnode(); 
    add(pointer,buffer); 
} 

void printnode(struct node *ptr) 
{ 
    printf("Name ->%s\n", ptr->terminalc); 
} 

而且這是在我的主:

terminal(buffer,pinakas[i].termatika[j]); 
printnode(pinakas[0].termatika[0]); 
+0

我的代碼有什麼問題? – MoglisSs

+0

查看@ amit_g的更正。 –

+0

ahaaaa很好再soz :) – MoglisSs

回答

0

在C它從來沒有一個真正的好主意,試圖在函數調用傳遞整個對象(尤其是對象的數組/列表)。這使用了大量的堆棧空間,並導致處理器將大量內存從堆中複製到堆棧,耗費了大量的時鐘週期。始終通過引用或指針傳遞對象。也就是說,它看起來像你正在嘗試編寫一個鏈接列表算法(我最喜歡的算法之一)。我建議嘗試這樣的事:

typedef struct node_tag // <- Use typedef for easy reference in source 
{ 
    char terminalc[61]; // <- This will allocate space for an array of 8-bit characters for each node 
    node_tag *next; // <- Use struct tag to reference internally 
} node_t; // <- This is the name of the node type to use in your source 

node_t * nodeList = NULL; // <- Root pointer for your list. 

void Add(node_t *ptr,char buffer[]) // <- Remember char buffer[] is the same as char *buffer 
{ 
    // ptr will already be pointing to allocated memory, so do not reassign. 
    //ptr = (struct node *) malloc(sizeof(struct node)); 

    strcpy(ptr->terminalc, buffer); 

    // When adding to a link list ptr-next should always be NULL. 
    ptr->next=NULL; 

    root=ptr; 
} 

void main(void) 
{ 
    ptr = (node_t*)malloc(sizeof(node_t)); 
    Add(ptr, "Some character array"); 
    ... 
} 

或者,如果你Add()內的內存分配,你可以做這樣的事情:

void Add(char buffer[]) 
{ 
    ptr = (struct node *) malloc(sizeof(struct node)); 

    strcpy(ptr->terminalc, buffer); 

    ptr->next=NULL; 

    root=ptr; 
} 

請記住,你的Add()函數應該並不總是添加到root,但它應該查找列表的末尾。這可以通過while循環很容易地完成,或者您的算法可以維護一個單獨的endOfList指針變量,該變量始終指向列表中的最後一個節點。