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

时间:2013-04-07 21:00:00

标签: c malloc mutex

我是C的新手并且一直致力于获取指针等等。我正在学校里练习,我们应该把所有必需的记忆都包括在内,包括互斥体。据我所知,malloc总是返回一个指向某个内存的指针(除非它失败)。如果是这种情况,你会怎么malloc为类似互斥的东西,从根本上不是指针?

在作业中,我们非常明确地说我们必须为互斥体做这件事,但我无法在任何地方找到这样做。

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

3 个答案:

答案 0 :(得分:6)

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

您的互斥锁可能定义如下: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保留的内存中的互斥。

答案 1 :(得分:1)

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);

答案 2 :(得分:0)

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;

此处,mutexmutex_t,而不是指向一个的pmutex->field mutex.field 。访问互斥体的字段将是

mutex_t

引用整个*pmutex mutex

mutex_t

引用pmutex &mutex 的地址:

{{1}}