C语言中的结构和指针问题

C语言中的结构和指针问题,c,pointers,struct,C,Pointers,Struct,我是新手。指针使我疯狂。 现在,我正在做套接字编程项目。 这是我的密码 typedef struct { char *ip[INET6_ADDRSTRLEN]; char *username[20]; time_t login_time; enum client_state client_state; int no_login; } Client; Client client[max_connect

我是新手。指针使我疯狂。 现在,我正在做套接字编程项目。 这是我的密码

typedef struct {
        char *ip[INET6_ADDRSTRLEN];
        char *username[20];
        time_t login_time;
        enum client_state client_state;
        int no_login;
    } Client;

    Client client[max_connections] = {}; // set to null
char remoteIP[INET6_ADDRSTRLEN];
.
.
.
.
.
if(client[new_fd-4] == NULL) {  // if fist attempt, client always null
   // I want to setting client[new_fd-4].ip = &remoteIP
   // How to write the code ??
}
{}并不意味着空,它意味着零初始化

不能将null值放入客户机数组,因为客户机是一个结构数组,并且结构不能为null。如果希望客户端数组能够包含空值,则需要将其设置为指向结构的指针数组,例如client*client[max_connection]={};。这会将客户端中的所有值设置为NULL,因为当谈到指针时,0和NULL是同义词。当不涉及指针时,这是不正确的,因为指针以外的任何东西都不能为null

请注意,由于客户端现在将包含指针,因此必须使用malloc和free分配和取消分配客户端结构,例如

当您处理完某个元素客户端[i]时:

我真的怀疑你是否想这么做:

// I want to setting client[new_fd-4].ip = &remoteIP
我认为您真正想要的是将remoteIP中包含的数据复制到ip成员中,如下所示:

memcpy(client[new_fd-4]->ip, &remoteIP, INET6_ADDRSTRLEN);
更新:客户端[最大连接数]={};将创建一个客户端对象数组,其所有字段都初始化为零。因此,检查应该类似于:ifclient[new_fd-4].ip==NULL

如果remoteIP是一个静态数组,或者如果它是一个本地数组,并且在返回当前函数后不会使用客户端[new_fd-4],那么您可以执行以下操作:

client[new_fd - 4].ip = remoteIP;
否则,您应该分配内存并执行memcpy

client[new_fd - 4].ip = malloc(INET6_ADDRSTRLEN);
strncpy(client[new_fd - 4].ip, remoteIP, INET6_ADDRSTRLEN);

我假设您不是要将ip结构成员定义为char*数组,也不是用户名结构成员

尝试:

在守则中:

strncpy(client[new_fd-4].ip, remote_ip, INET6_ADDRSTRLEN);

从C基础开始,指针在C中是必不可少的。我对memcpyclient[new_fd-4]->ip、&remoteIP、INET6\u ADDRSTRLEN;行有一个问题。编译器警告我../src/server.c:362:警告:传递'memcpy'的参数1将从整数生成指针,而不进行强制转换。在我运行之后,它会在执行这一行之后终止。如果您将char*作为ip和用户名的类型,那么它应该是char。您需要这些成员的字符数组,而不是字符指针数组。起初我忽略了这个错误。对不起,我忘记设置char*ip[INET6_ADDRSTRLEN];字符*用户名[20];。现在可以了。但我发现了新的问题,我只记得ip,但“ip”和“用户名”发生了变化。IP:::1用户名:::1对不起,这又是我的错误。我忘了初始化IP和用户名的大小。
client[new_fd - 4].ip = malloc(INET6_ADDRSTRLEN);
strncpy(client[new_fd - 4].ip, remoteIP, INET6_ADDRSTRLEN);
typedef struct {
    char ip[INET6_ADDRSTRLEN];
    // ...
 } Client;
strncpy(client[new_fd-4].ip, remote_ip, INET6_ADDRSTRLEN);