структура calloc c

C99 gcc

Я продолжаю получать эту ошибку. У меня есть структура вне main. А внутри main я пытаюсь выделить в стеке с помощью calloc. Кажется, я не могу понять, что не так.

Спасибо за любой совет,

ошибка: ожидаемое выражение перед токеном ‘)’

/* global */
struct port_data_t                                                                      
{                                                                                       
    size_t task_id;                                                                     
    pthread_t *thread_id;                                                               
    size_t start_port;                                                                  
    size_t number_ports;                                                                
} *port_data;                                                                           


/* main function */
struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*));

person ant2009    schedule 09.03.2009    source источник
comment
по какой причине вы применяете тип, отличный от того, который вы назначаете?   -  person Mitch Wheat    schedule 09.03.2009
comment
Я внес некоторые изменения. Должно быть так: struct port_data_t port_data = (struct port_data_t) calloc(4, sizeof(port_data*));   -  person ant2009    schedule 09.03.2009
comment
Я думаю, вам может понадобиться опубликовать весь код (если не слишком длинный)   -  person Mitch Wheat    schedule 09.03.2009
comment
calloc() выделяет память в куче, а не в стеке, поэтому вам нужно вручную использовать free() для предотвращения утечек. alloca() размещает в стеке, но это не стандартная функция - ни C99, ни POSIX. Однако он присутствует в BSD и Linux.   -  person qrdl    schedule 09.03.2009


Ответы (4)


Должно быть calloc(4, sizeof(*port_data)): Примечание * передимя переменной.

person Simon Buchan    schedule 09.03.2009

должен быть sizeof(port_data_t), а не sizeof(port_data*). Первый — это размер структуры port_data_t. Последнее ничего не значит.

person Crashworks    schedule 09.03.2009
comment
Я предпочитаю использовать *‹allocated ptr›, меньше поломок при изменении типа. - person Simon Buchan; 09.03.2009
comment
Должно быть sizeof(struct port_data_t), а не sizeof(port_data_t), если я не ошибаюсь. - person Chris Lutz; 09.03.2009
comment
Плюс! Убей язычника плюсера! :) - person Simon Buchan; 09.03.2009
comment
Я думаю, что это лучший ответ, потому что тот, который принят, может вызвать недопонимание между *<allocated ptr> и <allocated ptr>*. - person Kyrol; 15.12.2016

Попробуйте изменить это:

struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*));

К этому:

port_data = (struct port_data_t*) calloc(4, sizeof(*port_data));

Может работать немного лучше. Если вы объявили port_data глобальной структурой, вам не нужно повторно объявлять ее как struct port_data_t. GCC уже должен это знать. Конечно, как бы я это сделал:

port_data = (struct port_data_t*) calloc(4, sizeof(struct port_data_t));

Но мне не нравится помещать переменные в sizeof(). Я стараюсь придерживаться типов, просто по привычке. Кроме того, он разрешает любые неясности в отношении того, как именно должен быть разыменован указатель, что в данном случае сбивает вас с толку.

person Chris Lutz    schedule 09.03.2009
comment
Конечно, использование переменной намного безопаснее, когда вы меняете тип указателя... - person Simon Buchan; 09.03.2009

Как указал Jeffamaphone, task_data_t находится вне контекста. И также указано Crashworks, попробуйте sizeof (port_data_t), если вы хотите массив структур в port_data.

Использование sizeof (port_data*) заставит его выделить указатель sizeof указателю port_data_t, который в большинстве случаев полезен только в большинстве случаев.

person Alphaneo    schedule 09.03.2009
comment
Нет, он имеет в виду sizeof(struct port_data_t). Я проверил это с помощью GCC, и он не работает без ключевого слова struct. - person Chris Lutz; 09.03.2009