不确定为什么全局变量没有变化

时间:2014-10-31 18:57:52

标签: c pointers

在下面的函数中,我使用两个全局变量ptr和tcb调用add_to_list。

在add_to_list中,如果ptr不存在,它会为其内存malloc并附加上一个和下一个节点。

这在add_to_list中有效,但是当我离开时,tcb就像一个局部变量,并且为null。当我再次调用add_to_list时,它会将ptr视为null。

tcb在add_to_list函数之外初始化为null,但是它作为指针传入,所以不会在该地址进行更改使其成为全局变量?

我在做什么,所以更改确实坚持tcb而不是下次我去调用add_to_list tcb为null。

struct TCB_t *ptr = NULL;
struct TCB_t *tcb = NULL;

void start_thread(void (*function)(void))
{
    printf("In main: creating thread\n");
    struct stack * stackP = (struct stack*)malloc(8192);
    tcb = (struct TCB_t *)malloc(sizeof(struct TCB_t));
    init_TCB (tcb, function, stackP,  8192);
    add_to_list( ptr, tcb);
}

struct TCB_t* create_list()
{
    return (struct TCB_t*)malloc(sizeof(struct TCB_t));
}

void add_to_list( struct TCB_t *ptrBlock, struct TCB_t * addQ)
{
    addQ->val =iter;
    iter++;

    if(!ptrBlock)
    {
        ptrBlock = create_list();
        ptrBlock = addQ;
        ptrBlock->next = ptrBlock;
        ptrBlock->previous = ptrBlock;
    }
}

2 个答案:

答案 0 :(得分:2)

您正在通过值传递指针变量ptrtcb (事实上,这是在C中传递任何参数的唯一方式)。如果您希望能够通过函数修改这些变量,那么您必须将指针传递给它们:

void start_thread(void (*function)(void))
{
    /* ... */
    add_to_list( &ptr, &tcb);
}


void add_to_list( struct TCB_t **ptrBlock, struct TCB_t **addQ)
{
    *addQ->val =iter;
    iter++;

    if(!*ptrBlock)
    {
        *ptrBlock = create_list();
        *ptrBlock = addQ;
        *ptrBlock->next = *ptrBlock;
        *ptrBlock->previous = *ptrBlock;
    }
}

答案 1 :(得分:1)

你需要传递地址,函数声明会变成

void add_to_list( struct TCB_t **ptrBlock, struct TCB_t ** addQ)

由于它们是全局的,您实际上可以直接访问它们,而不会将它们作为函数参数传递