2014-10-31 98 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) 

因爲它們是全球性的,實際上你可以直接進出它們傳遞作爲函數的參數也

相關問題