Проблема со структурой и указателем на языке Си - PullRequest
0 голосов
/ 30 августа 2010

Я новичок.Указатель сделает мой сумасшедший Т_Т.Сейчас я занимаюсь проектированием сокетов.Это мой код.

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 ]

5 голосов
/ 30 августа 2010

{} не означает «ноль», это означает «инициализированный нулем».

Нельзя помещать нулевые значения в массив client, поскольку client - это массив структур, а структуры не могут быть нулевыми. Если вы хотите, чтобы массив client мог содержать «нулевые» значения, вам нужно сделать его массивом указателей на структуры , например, 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 голос
/ 30 августа 2010

Я предполагаю, что вы не хотели определять элемент структуры ip как массив char* или элемент структуры username.

Попробуйте:

typedef struct {
    char ip[INET6_ADDRSTRLEN];
    // ...
 } Client;

и в коде:

strncpy(client[new_fd-4].ip, remote_ip, INET6_ADDRSTRLEN);
1 голос
/ 30 августа 2010

Обновление: 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...