C语言 Malloc类型定义结构问题



我正在构建一个线程库,由于某种原因,我遇到了一个简单的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 = %in", sema->val);
}
void ta_sem_wait(tasem_t *sema)
{
    printf("SemaVal = %in", sema->val);
    if(sema->val <= 0)
    {
        //not done yet
        printf("SWAPPINGn");
    }
    else
    {
        printf("SemaVal = %in", 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 = 5SemaVal = 0交换

所以很明显,我没有正确地错置我的结构,因为一旦我超出作用域,里面的值就会丢失。我知道我一定是忘记了一些简单的事情。什么好主意吗?

您似乎无法决定谁负责分配您的tasem_t结构。您为它设置了一个全局变量,并将其地址传递给ta_sem_init。但是你让ta_sem_init动态地分配一个全新的tasem_t结构,把它的地址保存给sema,一个局部函数参数,所以当它超出作用域时,地址就会丢失。

任选其一:

  • ta_sem_init初始化一个已存在的 tasem_t变量
  • ta_sem_init分配和初始化一个新的 tasem_t结构,然后返回它的地址(直接或通过tasem_t**输出参数)。

相关内容

  • 没有找到相关文章

最新更新