2

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

在作业中,非常明确地指出,我们也必须为互斥锁执行此操作,但我无法在任何地方找到如何执行此操作。

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

4

3 回答 3

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 保留的内存中实际构造互斥锁。

于 2013-04-07T21:05:42.207 回答
2

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);
于 2013-04-07T21:07:59.423 回答
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;

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

pmutex->field
mutex.field

引用一个整体mutex_t

*pmutex
mutex

参考地址mutex_t

pmutex
&mutex    
于 2013-04-07T21:07:36.123 回答