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

时间:2010-08-30 13:07:00

标签: c pointers struct

我是新手。指针使我疯狂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 ??
}

3 个答案:

答案 0 :(得分:5)

{}并不意味着“null”,它意味着“零初始化”。

您不能将空值放入client数组中,因为client是一个结构数组,结构不能为空。如果您希望client数组能够包含“null”值,则需要使其成为指向结构指针的数组,例如: Client* client[max_connection] = {};。这会将client中的所有值设置为NULL,因为在讨论指针时,0NULL是同义词。当不涉及指针时,这不是真的,因为除指针之外的任何东西都可以为空。

请注意,由于client现在将包含指针,因此您必须使用Clientmalloc分配和取消分配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);