在下面的函数中,我使用两个全局ptr和tcb调用add_to_list。
在AddioToStLIST中,如果PTR不存在,它会为它错开内存,并附加上一个和下一个节点。
这可以在add_to_list中工作,但是当我离开tcb时,它就像一个局部变量,并且是空的。当我再次调用add_to_list时,它将ptr视为空。
tcb在add_to_list函数外初始化为null,但它作为指针传入,所以在该地址进行更改不会使它成为全局的吗?
我在做什么呢?这样做的话,更改会一直保留到tcb,而不是下次调用add_to_list tcb时,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;
}
}
最佳答案
您正在按值传递指针变量ptr
和tcb
(实际上,这是在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;
}
}