2014-09-05 7 views
-2

Я разрабатываю программу клиент-сервер, и когда я пытаюсь реализовать пользовательский связанный список, используя эту структуру:памяти код распределения ошибок

typedef struct user { 
    char username[50]; 
    int user_pid; 
    struct user *next; 
} user_list; 

Я пытаюсь выяснить, что случилось с кода, потому что компилятор не дает мне никакой ошибки, но когда я пытаюсь распечатать список пользователей, он просто ничего не отображает.

функция AddUser:

AddUser(user_list *head, req req) 
{ 
    if(head == NULL) 
    { 
     head = malloc(sizeof(user_list)); 

     if (head == NULL) 
      fprintf(stdout,"[SERVER] Error memory allocation "); 

     strcpy(head->username, req.str); 
     head->user_pid = req.client_pid; 
     head->next = NULL; 
    } 
    else 
    { 
     user_list *current = head; 

     while (current->next != NULL) 
      current = current->next; 

     current->next = malloc(sizeof(user_list)); 
     strcpy(current->next->username, req.str); 
     current->next->user_pid = req.client_pid; 
     current->next->next = NULL; 
    } 
    num_users++; 
} 

Основные функции (короткая версия)

int Main() 
{ 
struct request req; 
struct answer ans; 
user_list *head = NULL; 

do{ 

    read(fifo_1, &req, sizeof(req)); // Read client request 

    if(strcasecmp(req.str, "adduser") == 0) 
    {    
     AddUser(head, req); 
     strcpy(ans.str, "User added with success! You're logged!"); 
    } 

    if(strcasecmp(req.str, "users") == 0) // Print on the screen the users list 
    { 
     user_list *current = head; 

     while (current != NULL) 
     { 
      fprintf(stdout, "%s\n", current->username); 
      fprintf(stdout, "%d\n", current->user_pid); 
      current = current->next; 
     } 

    } 
}while(strcmp(req.str,"exit") != 0); 
} 
+0

@pzaenger мой плохой, я написал эту часть, чтобы показать здесь, и я забыл. Я уже редактировал сообщение. –

+3

Переменная 'head' функции' main' не обновляется в AddUser. Вам нужно передать ссылку на указатель или указатель на указатель, чтобы иметь возможность обновлять внутреннюю часть и отображать ее снаружи. Используйте это: 'void AddUser (user_list * & head, req req)' или 'void AddUser (user_list ** head, req req)' – NetVipeC

+2

'int Main()' тоже не является обычным C (C чувствителен к регистру и это 'int main()'). Пожалуйста, просмотрите, как создать MCVE ([Минимальный, полный, проверенный пример] (http://stackoverflow.com/help/mcve)) или SSCCE ([Short, Self-Contained, Correct Example] (http: // sscce .org /)) - два имени и ссылки для одной и той же базовой идеи. Это поможет вам лучше, чем не компилируемый код. Вам нужно проверить ошибку 'read()' call. –

ответ

1

Сопоставляя то, что другие уже отмечали в комментариях:

  1. Изменение main. Вместо

    int Main() 
    

    использования

    int main() 
    
  2. Значение head, не изменяется в main при изменении его в AddUser. Вот одно решение. Возврат head из AddUser.

    user_list* AddUser(user_list *head, req req) 
    { 
        if(head == NULL) 
        { 
         head = malloc(sizeof(user_list)); 
    
         if (head == NULL) 
          fprintf(stdout,"[SERVER] Error memory allocation "); 
    
         strcpy(head->username, req.str); 
         head->user_pid = req.client_pid; 
         head->next = NULL; 
        } 
        else 
        { 
         user_list *current = head; 
    
         while (current->next != NULL) 
          current = current->next; 
    
         current->next = malloc(sizeof(user_list)); 
         strcpy(current->next->username, req.str); 
         current->next->user_pid = req.client_pid; 
         current->next->next = NULL; 
        } 
        num_users++; 
        return head; 
    } 
    
  3. Захват возвращаемое значение AddUser в main. Вместо того, чтобы просто

    AddUser(head, req); 
    

    использования

    head = AddUser(head, req); 
    
+0

Он отлично работает! Спасибо, и я сожалею, что стал новичком, и концепция SSCCE для меня что-то новое. –

+1

@MarcodeBarbosa, добро пожаловать. Не нужно извиняться за то, что вы новичок. Мы все начали оттуда. Живи и учись :) –

Смежные вопросы