當然,您可以構建鏈接列表或任何其他數據結構,而無需動態內存分配。 儘管如此,不管你怎麼努力都不能分配內存。
備選:
創建一個全局或靜態存儲器池,你可以把你的對象,模仿堆/的malloc /免費。 FreeRTOS做類似的事情。 在這種情況下,你將不得不因爲你的程序和的開頭靜態分配的大內存塊將負責管理它,需要一個新的節點時返回正確的指針,並標記內存使用。
P.S .:我不會質疑你爲什麼要避免malloc。我認爲你有一個很好的理由。
在你的程序,當你這樣做,在第20行:
node newtemp,root,temp;
您allocatin THRE節點,其中之一, 「newtemp」。 那麼你在第28行做:
newtemp=getnode(i);
它只是副本在你的老「newnode」返回的節點的內容(controversal,是不是?)
所以你做什麼,只是波紋管:
temp.next=&newtemp;
設置一個指針,最初來自「root.next」到你的「newnode」。
if(root.next==NULL)
第一遍會是「NULL」,但是隻能替換相同的內容。
temp=*(temp.next);
{
root=temp;
}
是,再次,複製從單一的分配對象數據, 「*(temp.next)」,另一個 「溫度」。 它不創建任何新節點。
,如果你不喜歡這一點,將工作:
#include <stdio.h>
typedef struct node
{
int i;
struct node *next;
}
node;
#define MAX_NODES 10
node *create_node(int a)
{
// Memory space to put your nodes. Note that is is just a MAX_NODES * sizeof(node) memory array.
static node node_pool[ MAX_NODES ];
static int next_node = 0;
printf("[node *create_node(int a)]\r\tnext_node = %d; i = %d\n", next_node, a);
if (next_node >= MAX_NODES)
{
printf("Out of memory!\n");
return (node *)NULL;
}
node *n = &(node_pool[ next_node++ ]);
n->i = a;
n->next = NULL;
return n;
}
int main()
{
int i;
node *newtemp, *root, *temp;
root = create_node(0);
temp = root;
for (i = 1; (newtemp = create_node(i)) && i < MAX_NODES; ++i)
{
temp->next = newtemp;
if (newtemp)
{
printf("temp->i = %d\n", temp->i);
printf("temp->next->i = %d\n", temp->next->i);
temp = temp->next;
}
}
for (temp = root; temp != NULL; temp = temp->next)
printf(" %d ", temp->i);
return 0;
}
輸出:
$ gcc -Wall -o list_no_malloc list_no_malloc.c
$ ./list_no_malloc
[node next_node = 0; i = 0)]
[node next_node = 1; i = 1)]
temp->i = 0
temp->next->i = 1
[node next_node = 2; i = 2)]
temp->i = 1
temp->next->i = 2
[node next_node = 3; i = 3)]
temp->i = 2
temp->next->i = 3
[node next_node = 4; i = 4)]
temp->i = 3
temp->next->i = 4
[node next_node = 5; i = 5)]
temp->i = 4
temp->next->i = 5
[node next_node = 6; i = 6)]
temp->i = 5
temp->next->i = 6
[node next_node = 7; i = 7)]
temp->i = 6
temp->next->i = 7
[node next_node = 8; i = 8)]
temp->i = 7
temp->next->i = 8
[node next_node = 9; i = 9)]
temp->i = 8
temp->next->i = 9
[node next_node = 10; i = 10
Out of memory!
0 1 2 3 4 5 6 7 8 9
不使用'malloc'的鏈表?這甚至有可能嗎? – gablin 2010-10-04 14:46:44
爲什麼?我不確定,但是當我們有堆棧分配和定義好的複製構造函數時,爲什麼不可能? – letsc 2010-10-04 14:49:08
歡迎來到SO :)您可以也應該使用「010101」按鈕或4格縮進來將您的代碼片段標記爲代碼。我剛纔爲你做了。 – 2010-10-04 14:49:56