gpt4 book ai didi

c - 如何确定 malloc 将分配在不同的区域

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:19 24 4
gpt4 key购买 nike

我对 malloc 有一个奇怪的问题。我有这个类型定义:

typedef struct buffer {
int D;
int T;
unsigned int current_size;
unsigned int max_size;
pthread_mutex_t mutex;
pthread_cond_t non_pieno;
pthread_cond_t non_vuoto;
msg_t** messages;

struct buffer* (*buffer_init)(unsigned int);
void (*buffer_destroy)(struct buffer*);
} buffer_t;

这是 buffer_init 和 buffer_destroy 函数:

buffer_t* buffer_init(unsigned int maxsize)
{
buffer_t* new_buffer = (buffer_t*)malloc(sizeof(buffer_t));
msg_t** new_messages = (msg_t**)calloc(maxsize, sizeof(msg_t**));

pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t np = PTHREAD_COND_INITIALIZER;
pthread_cond_t nv = PTHREAD_COND_INITIALIZER;

new_buffer->T = 0;
new_buffer->D = 0;
new_buffer->current_size = 0;
new_buffer->max_size = maxsize;
new_buffer->messages = new_messages;
new_buffer->mutex = mx;
new_buffer->non_pieno = np;
new_buffer->non_vuoto = nv;

new_buffer->buffer_init = buffer_init;
new_buffer->buffer_destroy = buffer_destroy;

return new_buffer;
}

void buffer_destroy(buffer_t* buffer) {
pthread_mutex_destroy(&buffer->mutex);
free(buffer);
}

如果我打印(在每次调用正确的 buffer_destroy buffer_init 序列之后)我获得的指针,它们几乎是一样的!!例如

buffer_t* my_buff;

my_buff = buffer_init(1);
printf("%d", my_buff); //e.g 10023
printf("%d", my_buff->mutex); //e.g 56778

buffer_destroy(my_buff);
my_buff = buffer_init(1);
printf("%d", my_buff); //10023 again!!!
printf("%d", my_buff->mutex); //56778 again!!!

我很确定问题是 buffer_t 的初始化和释放出了问题,你知道吗,顺序是:

a) 如何正确地将缓冲区释放到 buffer_destroy 中?b) 如何正确初始化互斥量?我想在每次调用时创建一个新的互斥体!c) 我必须为 D 和 T 分配 malloc?我必须释放它们??

感谢您的宝贵时间!A.

最佳答案

这看起来不是问题!您已经分配了一些内存,然后将其释放回系统。然后您请求了一些相同大小的更多内存,并且 malloc 系统注意到有一些该大小的可用内存 - 与它之前给您的内存相同!

如果您删除对 buffer_destroy() 的调用,您应该会看到您获得了不同的值。 (顺便说一下,我建议使用“%p”来打印指针值,而不是“%d”)。

关于c - 如何确定 malloc 将分配在不同的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347557/

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