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