В 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" );
...
}
Или, если вы хотите выделение памяти внутри Add()
, вы можете сделать что-то вроде этого:
void Add( char buffer[] )
{
ptr = (struct node *) malloc(sizeof(struct node ) );
strcpy( ptr->terminalc, buffer );
ptr->next=NULL;
root=ptr;
}
Имейте в виду, что ваша Add()
функция не всегда должна добавлять к root
, но она должна искать конец списка. Это можно легко сделать с помощью цикла while
, или ваш алгоритм может поддерживать отдельную переменную-указатель endOfList
, которая всегда указывает на последний узел в списке.