2017-08-04 164 views
-2

我想編輯部分backnet堆棧不使用malloc,因爲它總是失敗。該代碼使用malloc創建一個對象並插入到鏈接列表中。在下面的代碼片段中,我已經註釋掉了malloc。我的計劃是創建一個結構的本地實例並將其插入到我的列表中。我能夠插入2個項目到我的列表中,當嘗試添加第三個時,列表未正確終止,並且我輸入了無限循環。任何人都可以看到爲什麼我的列表沒有正確終止?C鏈表無限循環

CHobjects是一個stuct,我想要一個鏈接列表。我不能使用malloc來創建新的CHobject實例。爲了解決這個問題,我試圖創建一個CHobject的本地實例並將其添加到我的列表中。

CHobjects* newNode(instance, channel, name, description) 
{ 
CHobjects *node; 
CHobjects newNode; 

    node=CHobjects; 
    while(node!=NULL) 
    { 
     if(node->instance==instance) 
      return 
     node=node->next; 
    } 
    if(strlen((char *)objectName)>objectNameMax || strlen((char *)description)>descriptionMax) 
     goto cc8; //fail name or description is too long 
// if((node=(CHobject *)malloc(sizeof(CHobject)))==NULL) //get a block of space for this object's info 
// goto cc8; //fail if we can't get space for it 
    test.next=CHobjects; //link on to list 
    CHobjects=&test; 
    CHcount++; 
} 

該代碼只是將元素添加到列表中,然後整個代碼將一些變量設置爲默認值。

+0

請顯示您的實際代碼。 objectName被定義在哪裏? 「CHobject」在哪裏定義? – lurker

+0

請發表真實的代碼。此外,使用良好的格式化'strlen((char *)objectName)> objectNameMax'和'strlen((char *)objectName-> objectNameMax'看起來完全相同並且很混亂 –

+0

它會編譯但是假設整數類型 –

回答

0

你的問題有點不清楚,但我認爲有可能給你一個有用的答案。

我能想到的,你可以實現,這是使用數組作爲存儲的鏈表,並作爲再加上你將同時擁有一個數組,並在同一時間

#include <stdio.h> 

struct list { 
    int value; 
    struct list *next; 
}; 

static void 
print_list(const struct list *item) 
{ 
    while (item->next != NULL) { 
     fprintf(stdout, "%d\n", item->value); 
     item = item->next; 
    } 
} 

int 
main(void) 
{ 
    struct list items[15]; 
    size_t count; 

    count = sizeof items/sizeof *items - 1; 
    for (int index = 0; index < count; ++index) { 
     items[index].next = &items[index + 1]; 
     items[index].value = index + 1; 
    } 
    items[count].next = NULL; 

    print_list(items); 
} 
鏈表的唯一途徑

如您所見,您需要訪問給定的數組元素以用作存儲位置,並且數組必須在鏈表的生命週期內有效。

+0

我試圖讓我的問題更清楚。上面發佈的代碼是完整的,因爲任何其他代碼只需設置默認值即可。我無法更改代碼結構,但我需要替換malloc的使用。 –

1

經過我們在評論中的廣泛討論後,我認爲你的問題顯然是在全局列表中使用本地結構實例。您在退出newNode()函數時在堆棧上創建的結構無效,並且在下次調用時會回收相同的堆棧空間。所以你將同一個實例鏈接到它自己,並且在兩次調用之後,你有一個循環列表,然後進入一個無限循環。

既然你明顯在普通的C沒有堆,你唯一的機會是在編譯時預先分配全局內存中的你自己的結構分配器。聲明足夠大的CHobjects全局數組以滿足您的所有分配(即列表的最大長度)。在你的情況,這似乎是4.這裏是一個原始的輪廓:

#define CHOBJECTS_MAX 4 

static CHobjects gaCHobjects [CHOBJECTS_MAX]; 
static int giNextSlot = 0; 

public: static CHobjects* Allocator() 
    { 
    return gaCHObjects + giNextSlot++; 
    } 

功能分配器()從全局陣列返回一個結構指針,並增加giNextSlot指數,讓你在每次調用得到一個新的實例。在newNode()中使用此指針而不是本地CHobjects實例。