我正在构建一个线程库,由于某种原因遇到了一个我现在无法修复的简单malloc问题。我确信这很简单,我只是错过了它。
在我的main.c中,我有以下代码:
//declare testSem
tasem_t testSem;
int main(int argc, char **argv){
ta_libinit();
//initialize testSem
ta_sem_init(&testSem, 5);
//wait test
ta_sem_wait(&testSem);
我的线程库中的相关代码如下:
void ta_sem_init(tasem_t *sema, int value)
{
//malloc the semaphore struct
sema = malloc(sizeof(tasem_t));
//error check
if(sema == NULL)
{
printf("could not malloc semaphore");
exit(0);
}
//initialize with the given value
sema->val = value;
printf("SemaVal = %i\n", sema->val);
}
void ta_sem_wait(tasem_t *sema)
{
printf("SemaVal = %i\n", sema->val);
if(sema->val <= 0)
{
//not done yet
printf("SWAPPING\n");
}
else
{
printf("SemaVal = %i\n", sema->val);
sema->val = sema->val + 1;
}
}
以下是我的头文件中的结构:
//struct to store each semas info
typedef struct tasem_t_struct
{
//value
int val;
//Q* Queue
//int numThreads
}tasem_t;
我得到的输出是:
SemaVal = 5 SemaVal = 0 交换
显然,我没有正确地对我的结构进行mallocing,因为一旦我超出范围,内部的值就会丢失。我知道我必须忘记一些简单的事情。有什么想法吗?
答案 0 :(得分:3)
您似乎无法确定谁负责分配您的tasem_t
结构。你有一个全局变量,并将其地址传递给ta_sem_init
。但是你有ta_sem_init
动态分配一个全新的tasem_t
结构,将其地址保存到sema
,一个本地函数参数,这样当地址超出范围时,地址就会丢失。
选择一个:
ta_sem_init
初始化现有的 tasem_t
变量。ta_sem_init
分配并初始化新的 tasem_t
结构,然后返回其地址(either directly or via a tasem_t**
output parameter)。