Как передать список в массиве указателей - PullRequest
1 голос
/ 01 декабря 2011

Я написал фрагмент кода и пытаюсь передать список в массив указателей, но мои указатели равны нулю.Я вызываю функцию из main, как вы можете видеть внизу, и я пытаюсь заполнить каждый указатель (termatika[j]) списком, но когда я собираюсь напечатать его, я получаю нулевое значение.

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]);

1 Ответ

0 голосов
/ 20 декабря 2011

В 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, которая всегда указывает на последний узел в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...