Я пытаюсь узнать, как использовать вложенные структуры, и я делаю пример «производителя и потребителя pthread».Как получить доступ к вложенным структурам и доступ к их содержимому, которое будет использоваться?
У меня есть эти инициализации:
int MAILBOX_SIZE = 10;
typedef struct Message {
int bytes;
void *data;
} Message;
typedef struct Mailbox {
Message *queue;
int in; //place to add next element in buffer
int out; //place to remove next element in buffer
int cnt; //number of elements in buffer
} Mailbox;
void mb_init(Mailbox *sb, int size);
Теперь я хочу, чтобы создать эту функцию инициализации, чтобы иметь возможность доступа к очереди.
Мой подход к этому может быть неправильно, но то, что я думал, это было:
void mb_init(Mailbox *sb, int size){
sb->queue=(Message*)malloc(sizeof(Message));
sb->queue->bytes = size;
printf("%i\n", sb->queue->bytes);
}
int mb_put(Mailbox *sb, Message *msg){
//actions of the producer
}
int mb_get(Mailbox *sb, Message *msg){
//actions of the consumer
}
И мой главный (псевдо-код, потому что у меня есть намного больше в основной) заключается в следующем:
int main() {
struct Mailbox *myMailbox;
mb_init(myMailbox, MAILBOX_SIZE);
}
В итоге я получаю «ошибку сегментации», и я знаю, что она исходит из моей функции «mb_init», потому что я не совсем уверен, как обрабатывать вложенные структуры. Как установить размер сообщения из этой функции init с помощью вложенных структур?
Любая помощь приветствуется. Я изучаю C; Прошу прощения, если некоторые вещи не являются «самым эффективным» способом.
вы должны передать указатель STRUCT по ссылке не по значению в противном случае вы должны вернуть '' sb' в mb_init'. –
@hiqutj, если вы передадите значение и не вернете указатель на новую выделенную память, когда функция вернется из 'stack', также будут потеряны необходимые изменения. –
@SeekAddo Я получаю это: expected 'struct Mailbox *', но аргумент имеет тип «struct Mailbox **», если я добавляю «&» перед myMailbox в mb_init (myMailbox, MAILBOX_SIZE); – hiquetj