2014-10-31 63 views
0

在以下函数中,我使用两个全局变量ptr和tcb调用add_to_list。不知道为什么全局变量没有变化

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

这工作在add_to_list内部,但是当我离开tcb时就像局部变量一样行为并且为空。当我再次调用add_to_list时,它将ptr视为null。

tcb被初始化为add_to_list函数之外的空值,但它作为指针传递,所以不会在该地址进行更改使其成为全局?

我在做什么,所以这些变化坚持tcb而不是我下次去打电话add_to_list tcb为空。

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; 
    } 
} 
+1

你传入全局变量的副本'ADD_TO_LIST()',而不是全局地址变量。该代码修改副本,但不影响原件。 – 2014-10-31 19:00:55

+0

我以为当你通过地址而不是副本的指针传递给你时,它就像使用&。 – Aaron 2014-10-31 19:03:38

+0

您需要将指针传递给一个指针('&tcb'),该函数将不得不期待('struct TCB_t ** ptrptrBlock')。你可以改变'tcb'指向的对象(如果它指向任何东西),但改变指针(所以'tcb'指向不同的东西),你必须传递一个指针指向指针。 – 2014-10-31 19:08:13

回答

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

你需要传递的地址,函数的声明将成为

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

因为它们是全球性的,实际上你可以直接进出它们传递作为函数的参数也

相关问题