Malloc Typedef结构问题

时间:2013-04-07 19:37:34

标签: c struct 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 = %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,因为一旦我超出范围,内部的值就会丢失。我知道我必须忘记一些简单的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您似乎无法确定谁负责分配您的tasem_t结构。你有一个全局变量,并将其地址传递给ta_sem_init。但是你有ta_sem_init动态分配一个全新的tasem_t结构,将其地址保存到sema,一个本地函数参数,这样当地址超出范围时,地址就会丢失。

选择一个: