在C中链表的末尾或开头添加节点



我试图在Linux中创建一个带有命名管道的服务器/客户机程序。每当客户端连接并进行身份验证时,服务器将其数据(pid和密码)存储在链表中。

问题是,在我存储第一个客户端的数据之后,每当我试图存储更多的数据(客户端)时,程序"给出"分段错误

typedef struct client client, *pno;
struct client
{
    pid_t pid;
    char password[TAM_MAX];
    pno next;   
};
int verify_struct(pno cliente_t)
{
    if (cliente_t == NULL) //verifica se a lista está vazia
        return 1;
    else
        return 0;
}
    pno AddClient(pno cliente_t, pid_t pid, char password[TAM_MAX]) 
    {
        pno new, aux;
        new = malloc(sizeof(client)); //aloca espaço
        if(new == NULL) //verifica se alocou o espaço com sucesso
            {
                printf("Memory allocation error!n");
                return cliente_t;
            }
        new->pid = pid;
        strncpy(new->password, password, TAM_MAX-1);
        if(verify_struct(cliente_t))
            {
                printf("Should be at startn");
                cliente_t = new;
                printf("Added at start!n");
            }
        else
            {
                //insert at end
                printf("Adding in the end!n");
                aux = cliente_t;
                while(aux->next != NULL)
                    aux = aux->next;
                aux->next = new;
                printf("Added sucssefully!n");
            }
        return cliente_t;
    }
bool isValidUser(pno cliente,  pid_t pid, char password[TAM_MAX])
{
    while(cliente != NULL)
        {
            if(cliente->pid == pid && strncmp(password, cliente->password, 100) == 0)
                {
                    return true;
                }
            cliente = cliente -> proximo;
        }
        return false;
}
    //progam itself :
int main(void)
{
    pno client=NULL;
    /* --code-- */
    while(1)
        {
                if(request.loggedIn == 0)
                    {
                        client=AddClient(client, request.pid, request.password);
                    }
                else
                    {
                        if(!isValidUser(cliente, perg.pid_cliente, perg.password))
                            abort();
                        //process commands
                    }
        }
}

输出:

1st Client -> Should be at start!
           -> Added at start!
2nd Client -> Adding in the end!
           -> segmentation fault (core dumped).

您需要将这一行添加到AddClient

new->next = NULL;

否则new->next包含未初始化的内存。稍后,当您检查aux->next != NULL时(aux现在等于之前的new),测试的结果不会为true,因为未初始化的内存并不恰好等于0。然后尝试在未初始化的内存中找到该值指向的另一个节点。它可能包含的数据实际上不是一个合法的内存地址,因此分段错误。

有两个非常相似的问题:

  1. 当添加到列表的末尾时,您需要确保new->next包含NULL,正如已经提到的@morningstar。
  2. 当添加到列表的开始时,您需要确保new->next包含cliente_t(在将其分配给new之前)。例如:

    printf("Should be at startn");
    new->next = cliente_t;
    cliente_t = new;
    printf("Added at start!n");
    

由于cliente = cliente -> proximo;未定义成员,代码无法编译…我猜你的意思是修改为-> next。请确保您在将来测试您的测试用例。

相关内容

  • 没有找到相关文章

最新更新