我写了一段代码,我试图将列表传递给指针数组,但我的指针是空的。我从main调用函数,你可以在底部看到我试图用列表填充每个指针(termatika[j]
),但是当我要打印它时,我得到null。
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 :(得分: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" );
...
}
或者,如果你想要1>}内部你的内存分配,你可以这样做:
Add()
请注意,void Add( char buffer[] )
{
ptr = (struct node *) malloc(sizeof(struct node ) );
strcpy( ptr->terminalc, buffer );
ptr->next=NULL;
root=ptr;
}
函数不应始终添加到Add()
,但它应该查找列表的末尾。这可以通过root
循环轻松完成,或者您的算法可以维护一个单独的while
指针变量,该变量始终指向列表中的最后一个节点。