我正在尝试学习如何使用嵌套结构,并正在做一个类似“pthread producer and consumer”的例子。
我已经初始化了这些:

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;如果有些事情不是“最有效”的方法,我很抱歉。

最佳答案

正如我已经说过的,您的问题是按值传递而不是按引用传递。
有很多方法可以做到这一点。你可以试试这个
主要

Mailbox myMailbox;                 // memory allocated on the stack, life span till the *return*
mb_init(&myMailbox, MAILBOX_SIZE); // pass the address here
// and don't forget to free the queue memory when you are done with it



//Main ends here




/* In your code if you don't return a pointer to the memory allocated here on the heap.
You will not get those changes when the function return from the stack.
It is best practice to return a pointer to the allocated heap memory
 before the function returns. */

void mb_init(Mailbox *sb, int size){
        ......
        ......

}

08-16 19:58