2013-05-28 42 views
0

我正在做一個桶排序,排序指向節點的鏈接列表與虛擬標題。用戶輸入節點的值,然後立即將其放入適當的桶中。當我試圖爲鏈表分配第二個節點(不包括虛擬頭文件)的內存時,出現問題。malloc正在做奇怪的事情與內存地址

這是用於將節點落入水桶的代碼,VAR是正被排序的值,和當前被新創建的節點進行排序:

void bucketSort(int var, nodeptr current) 
    if(!bucket[var]) 
    { 
    buckets[var] = (nodeptr) malloc(sizeof(nodeptr)); 
    buckets[var]->next = current; 
    bucketrear[var] = current; 
    } 
    else 
    { 
    bucketrear[var]->next = current; 
    bucketrear[var] = current; 
    } 
} 

這是一個簡化的版本(少的代碼值)用於創建新節點:

void addNode(int value) 
{ 
    nodeptr newNode; 

    newNode= (nodeptr) malloc(sizeof(nodeptr)); 

    newNode->value = value; 
    newNode->next = NULL; 


    bucketDrop(value, newNode); 
} 

隨着跟蹤語句,我發現之前的第二節點的malloc的(具有相同的值作爲第一),剷鬥的地址[值] - >下一個是普通地址,但之後地址是17在我做的每一個測試中都出現了17的值。

任何幫助或想法都會很棒。先謝謝你。

+11

'sizeof nodeptr'?你不是指'sizeof node'或'sizeof * newNode'嗎? – Zeta

+0

你可以粘貼你的sctruc嗎? – Maresh

+0

如果您有內存被覆蓋,請首先檢查您是否不使用指向您保存的本地變量的指針。我還推薦諸如[Valgrind](http://valgrind.org/)之類的工具。 –

回答

1

我覺得這是一個解決方案。

buckets[var] = (nodeptr) malloc(sizeof(*buckets[var])); 

newNode= (nodeptr) malloc(sizeof(*newNode)); 
+0

謝謝,那確實解決了它。 我正在使用講座中提供的malloc,而我的導師向我保證這是正確的。 – Thaotic

0

您正在混合節點的結構和指向它的指針,從而覆蓋內存位置。

由於您將malloc結果強制轉換爲nodeptr類型,這意味着這是一個指針(因爲malloc()返回一個指針),這也意味着您將分配內存大小的指針。

所以給你叫你的結構nodestruct,分配足夠的內存,你會寫

newNode = (nodeptr) malloc(sizeof(struct nodestruct)); 
+1

請不要在C中拋出malloc()的返回值。我認爲使用sizeof * newNode會比sizeof(struct nodestruct)更不容易出錯,但我猜可以這麼說。 –

+0

@RemiGacogne爲什麼你不會投入malloc的返回值?如果你不想在你的代碼中使用'void *',那麼你仍然必須在某個時刻投射?! – grasbueschel

+0

由於ANSI C,一個void指針可以安全地分配給任何指針類型,而無需強制轉換。所以它不再需要了,因爲每個演員都可以阻止編譯器稍後提醒您有關錯誤,所以不應該使用它。 –

0

下應該可以解決您的問題:

newNode =(NODEPTR)的malloc(的sizeof(* NODEPTR));

原因是nodeptr看起來是一個指向struct的指針,因此您應該爲struct而不是指針分配內存。

從下次請粘貼您的結構定義。