我是C的新手并且一直致力于获取指针等等。我正在学校里练习,我们应该把所有必需的记忆都包括在内,包括互斥体。据我所知,malloc总是返回一个指向某个内存的指针(除非它失败)。如果是这种情况,你会怎么malloc为类似互斥的东西,从根本上不是指针?
在作业中,我们非常明确地说我们必须为互斥体做这件事,但我无法在任何地方找到这样做。
最后,我不希望任何人担心“给我答案”,因为那不是我所分配的问题;相反,这是我们应该做的内存监控的必要条件;我只是不确定正确的语法应该是什么。
答案 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;
此处,mutex
是mutex_t
,而不是指向一个的pmutex->field
mutex.field
。访问互斥体的字段将是
mutex_t
引用整个*pmutex
mutex
:
mutex_t
引用pmutex
&mutex
的地址:
{{1}}