当然,您可以构建链表或任何其他没有动态内存分配的数据结构。
但是,无论您多么努力,您都无法完全不分配内存来构建它。
选择:
创建一个全局或静态内存池,您可以在其中放置对象,模仿堆/malloc/free。 FreeRTOS 做了类似的事情。
在这种情况下,您将在程序开始时静态分配一个大内存块和将负责管理它,在需要新节点时返回正确的指针并将该内存标记为已使用。
P.S.:我不会质疑你为什么要避免使用 malloc。我想你有一个很好的理由。
在你的程序中,当你这样做时,在第 20 行:
node newtemp,root,temp;
您正在分配三个节点,其中之一是“newtemp”。
然后你在第 28 行做:
newtemp=getnode(i);
这只是副本返回节点的内容覆盖旧的“newnode”(有争议,不是吗?)
所以你这样做,只是吼叫:
temp.next=&newtemp;
这设置了一个指针,该指针最初来自“root.next”到您的“newnode”。
if(root.next==NULL)
第一次通过时将为“NULL”,但随后仅替换相同的内容。
temp=*(temp.next);
{
root=temp;
}
又是复制从单个分配对象“*(temp.next)”到另一个对象“temp”的数据。
它不会创建任何新节点。
如果您这样做,它将起作用:
#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 )]
next_node = %d; i = %d
", next_node, a );
if ( next_node >= MAX_NODES )
{
printf( "Out of memory!
" );
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
", temp->i );
printf( "temp->next->i = %d
", 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