Получение ошибки при попытке вернуть указатель на структуру, которая объявлена ​​в заголовочном файле. - PullRequest
0 голосов
/ 17 января 2020

В одном из заголовочных файлов, с которыми я работаю, есть предварительное объявление структуры, которая гласит:

typedef struct my_server_t my_server_t;

, и функции, которая читает:

my_server_t *server_create();

Теперь в файле .c я пытаюсь реализовать функцию server_create. Вот что я делаю:

my_server_t* server_create(){
    struct server {
        unsigned short port;
        int pending_connections_allowed;
    } server_t;
    return (gfserver_t *)server_t;
}

Но когда я пытаюсь скомпилировать код .c, я получаю сообщение об ошибке:

error: operand of type 'struct server' where arithmetic or pointer type is required

Я не могу понять, что здесь происходит , Может кто-нибудь сказать, пожалуйста, как я могу вернуть структуру из server_create типа my_server_t*.

1 Ответ

1 голос
/ 17 января 2020

Я могу только догадываться о том, что должна делать эта функция, но вы, похоже, хотите выделить новую структуру my_server_t и вернуть ее. Вместо этого вы определяете новую структуру внутри своей функции и возвращаете ее, которая недопустима.

Вероятно, вам нужно следующее:

my_server_t *server_create(void) {
    my_server_t *srv = malloc(sizeof my_server_t);
    if (srv == NULL)
        return NULL; // Failed to allocate memory.

    srv->port = /* some default value */;
    srv->pending_connections_allowed = /* some default value */;

    return srv;
}

Вы также можете передавать значения полей в качестве аргументов, если вы хотите:

my_server_t *server_create_with_values(unsigned short port, int pending) {
    my_server_t *srv = malloc(sizeof my_server_t);
    if (srv == NULL)
        return NULL; // Failed to allocate memory.

    srv->port = port;
    srv->pending_connections_allowed = pending;

    return srv;
}

Позже в вашем коде вы можете использовать функцию:

my_server_t *foo = server_create();
// or
my_server_t *foo = server_create_with_values(1337, 0);

Также не забудьте освободить выделенную память, когда она больше не нужна:

free(foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...