我是 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