我正在尝试学习如何使用嵌套结构,并正在做一个类似“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){
......
......
}