gpt4 book ai didi

c - 如何访问嵌套结构并访问其要使用的内容?

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:31 25 4
gpt4 key购买 nike

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

我的 main(伪代码,因为我在 main 中有很多)是这样的:

int main() {
struct Mailbox *myMailbox;
mb_init(myMailbox, MAILBOX_SIZE);
}

我最终得到一个“段错误”,我知道它来 self 的“mb_init”函数,因为我不太确定如何处理嵌套结构。如何使用嵌套结构设置来自此 init 函数的消息的大小?

感谢任何帮助。我正在学习 C;如果某些事情不是“最有效”的完成方式,我很抱歉。

最佳答案

编译器警告 (-Wall) 指出了问题。

test.c:27:12: warning: variable 'myMailbox' is uninitialized when used here [-Wuninitialized]
mb_init(myMailbox, MAILBOX_SIZE);
^~~~~~~~~
1 warning generated.

您传入 myMailbox 并在没有为其分配内存的情况下使用它。通常,不要传入指向初始化函数的指针,返回一个。

您也不应该在邮箱中初始化空消息,只需初始化邮箱即可。让任何添加消息的人初始化 Message 并将其传入。

Mailbox *mb_init(int size){
Mailbox *sb = malloc(sizeof(Mailbox));

sb->queue = NULL;
sb->in = 0;
sb->out = 0;
sb->cnt = 0;

return sb;
}

这给我们带来了下一个问题:您只在队列中为一条消息分配了空间。而且它不存储指向消息的指针,它必须复制它们并且它们可能会变得很大。

相反,使用消息指针数组。

const size_t MAILBOX_SIZE = 10;

typedef struct {
size_t bytes;
void *data;
} Message;

typedef struct {
Message **queue;
size_t in; //place to add next element in buffer
size_t out; //place to remove next element in buffer
size_t cnt; //number of elements in buffer
size_t max_size;
} Mailbox;

Mailbox *mb_init(size_t size){
Mailbox *mb = malloc(sizeof(Mailbox));
mb->queue = malloc(sizeof(Message*) * size);
mb->in = 0;
mb->out = 0;
mb->cnt = 0;
mb->max_size = size;

return mb;
}

void mb_destroy( Mailbox *mb ) {
free(mb->queue);
free(mb);
}

我还做了一些其他的改变。最明显的是切换到 size_t 来存储事物的大小。这避免了碰到整数限制。

我添加了一个析构函数,您应该始终为所有结构编写一个初始化程序和一个析构函数。

邮箱现在存储其最大大小。它需要知道这一点以避免添加太多消息。以后的版本会切换到链表或根据需要重新分配队列。

我还确保始终使用 typedef,而不是底层结构类型,甚至从结构中删除了名称,这样就无法直接引用它们。现在只有一种方法可以引用结构,这样更容易阅读。它还提供更强的封装,如果类型发生根本变化,比如切换到索引其他存储的整数(不太可能,但你永远不知道)。

关于c - 如何访问嵌套结构并访问其要使用的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42335469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com