我是新手。指针使我疯狂T_T。 现在,我正在进行套接字编程项目。 这是我的代码。
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 ??
}
答案 0 :(得分:5)
{}
并不意味着“null”,它意味着“零初始化”。
您不能将空值放入client
数组中,因为client
是一个结构数组,结构不能为空。如果您希望client
数组能够包含“null”值,则需要使其成为指向结构指针的数组,例如: Client* client[max_connection] = {};
。这会将client
中的所有值设置为NULL
,因为在讨论指针时,0
和NULL
是同义词。当不涉及指针时,这不是真的,因为除指针之外的任何东西都可以为空。
请注意,由于client
现在将包含指针,因此您必须使用Client
和malloc
分配和取消分配free
结构,例如
if(client[new_fd-4] == NULL) { // if fist attempt, client always null
client[new_fd-4] = malloc(sizeof(Client));
client[new_fd-4]->no_login = 1; // For example. Note use of -> instead of .
}
当你完成了一些元素client[i]
:
free(client[i]);
client[i] = NULL; // Not strictly necessary, but a good idea
我真的怀疑你想要这样做:
// I want to setting client[new_fd-4].ip = &remoteIP
我认为您真正想要的是将remoteIP
中包含的数据复制到ip
成员中,如下所示:
memcpy(client[new_fd-4]->ip, &remoteIP, INET6_ADDRSTRLEN);
答案 1 :(得分:1)
更新:Client client[max_connections] = {};
将创建一个Client
个对象数组,其所有字段都初始化为零。因此,检查应该是:if(client[new_fd-4].ip == NULL)
如果remoteIP
是一个静态数组,或者它是一个本地数组,并且在返回当前函数后将不会使用client[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);
答案 2 :(得分:1)
我假设您并不是要将ip
结构成员定义为char*
的数组,也不是username
结构成员。
尝试:
typedef struct {
char ip[INET6_ADDRSTRLEN];
// ...
} Client;
在代码中:
strncpy(client[new_fd-4].ip, remote_ip, INET6_ADDRSTRLEN);