C语言 如何使用 malloc 为非指针对象(如互斥锁)分配空间



我是 C 语言的新手,一直在努力获取指针等。我正在学校做一个练习,在这个练习中,我们应该错误地分配所有必需的内存,包括互斥体。据我所知,malloc 总是返回指向某个内存的指针(除非它失败(。如果是这种情况,您将如何对互斥锁之类的东西进行malloc,这基本上不是一个指针?

在作业中,它非常直截了当地指出,我们也必须为互斥体执行此操作,但我在任何地方都找不到如何做到这一点。

最后,我

不希望任何人担心"给我答案",因为这不是我被分配的问题; 相反,这是我们应该做的内存监控的必要条件;我只是不确定正确的语法应该是什么。

您可以有指向任何类型的指针。

您的互斥锁可能是这样定义的:struct mutex_t {..} .如果是这样,你可以有一个指向它的指针:struct mutex_t *my_mutex以后可以用来存储 malloc 返回的指针。请参阅此示例:

struct mutex_t *my_mutex;
my_mutex = malloc(sizeof(struct mutex_t));

第二行启动my_mutex指向指向互斥结构大小的内存的指针。现在,很可能您正在使用的库定义了函数来初始化它,例如void mutex_init(struct mutex_t*),您可以使用它实际在malloc保留的内存中构造互斥锁。

malloc总是会给你一个指向内存的指针,用于一个对象。但是,如果您习惯于使用堆栈上自动分配的对象,则始终可以使用指针,然后根据需要取消引用。

例如,如果您习惯于:

mutex_t bar;
lock_mutex(bar);
unlock_mutex(bar);

相反,你会这样做

mutex_t *bar = malloc(sizeof(mutex_t));
lock_mutex(*bar);
unlock_mutex(*bar);
free(bar);

但是,我熟悉的所有 C 线程库都需要指针参数。例如,对于 pthreads,您可以执行类似操作

pthread_mutex_t foo;
pthread_mutex_init(&foo, NULL);
pthread_mutex_lock(&foo);
pthread_mutex_destroy(&foo);

&foo意味着您实际上已经传递了一个指向foo的指针,因此foo如果它是一个指针,只需删除引用运算符即可。

pthread_mutex_t *foo = malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(foo, NULL);
pthread_mutex_lock(foo);
pthread_mutex_unlock(foo);
pthread_mutex_destroy(foo);
free(foo);
As far as I am aware, malloc always returns a pointer to some memory (unless it fails). If this is the case, how would you malloc for something like a mutex, which is fundamentally not a pointer?

指针是指向事物的指针;互斥锁与任何其他对象一样,可以具有指向它的指针。如果您有某种类型mutex_t那么有一个类型mutex_t*。所以

mutex_t* pmutex = malloc(sizeof *pmutex);

分配互斥锁所需的字节数,并将指向这些字节的指针存储在 pmutex 中。请注意这与

mutex_t mutex;

在这里,mutex是一个mutex_t,而不是指向一个的指针。访问互斥锁的字段将是

pmutex->field
mutex.field

指整个mutex_t

*pmutex
mutex

要参考mutex_t的地址:

pmutex
&mutex    

相关内容

  • 没有找到相关文章

最新更新