2011-11-30 54 views
1

我想使指针数组中的最后一个元素为NULL,但我有一些问题。我的代码如下:如何使指针指针NULL

kernel->availMsgEnvQueue = (MsgEnv *)malloc(AVAIL_MSG_ENV_SIZE * sizeof(MsgEnv)); 
int i; 
for(i=0; i<AVAIL_MSG_ENV_SIZE-1; i++) 
    { 
    kernel->availMsgEnvQueue[i].nextMsgEnv = &(kernel->availMsgEnvQueue[i+1]); 
    kernel->availMsgEnvQueue[i].msg = (Msg)malloc(MSG_SIZE * sizeof(char)); 
} 
kernel->availMsgEnvQueue[19].nextMsgEnv = NULL; 

哪里AVAIL_MSG_ENV_SIZE是20.我试图让20元一空,但是这是行不通的,因为我得到一个分段错误,当我运行下面的测试:

while (kernel->availMsgEnvQueue->nextMsgEnv) 
    { 
    printf ("%d\n", x); 
    temp = temp->nextMsgEnv; 
    x++; 
} 

X一直计数到20,然后崩溃。请协助。


编辑: Apparantly在列表的最后一个元素被发送到零。我不知道这段代码是否会将队列中的最后一个消息信封出队:

MsgEnv * k_request_msg_env(){ 
    MsgEnv * env = kernel->availMsgEnvQueue->nextMsgEnv; 
    if(!env){ 
     printf ("This one was null"); 
     PCB * pcb = kernel->current_process; 
     if(pcb->state != IS_IPROCESS){ 
      printf ("Process %d is being blocked on request",pcb->id); 
      pcb->state = BLOCK_ON_ENV; 
      enPQ(kernel->bq, pcb, pcb->priority); 
      k_process_switch(); 
     } 
    }else{ 
     kernel->availMsgEnvQueue->nextMsgEnv = kernel->availMsgEnvQueue->nextMsgEnv->nextMsgEnv; 
     env->nextMsgEnv = NULL; 

     //clear message 
     memset(env->msg, 0, MSG_SIZE); 
    } 
    return env; 
} 

谢谢!

+0

'为(I = 0; I

+1

而且,当然'而(TEMP-的> nextMsgEnv){' –

+0

一些杂散注释:(1)应该使用'AVAIL_MSG_ENV_SIZE - 1'而不是'19',前者是你的意思; (2)是'Msg'定义为指针类型?如果不是,你应该把'malloc'的返回值赋给'Msg *',而不是'Msg'; (3)你如何初始化'temp'? (我假设'temp = kernel-> availMsgEnvQueue [0]'?) – ruakh

回答

2

你的循环测试不会改变:

while (kernel->availMsgEnvQueue->nextMsgEnv) { 

所以它是通过迭代20次,并保持要去...

也许你的意思呢?

while (kernel->availMsgEnvQueue[x].nextMsgEnv) { 
+0

现在它给了我一个元素的分段错误...确实kernel-> availMsgEnvQueue [19] .nextMsgEnv = NULL;使最后一个元素0? – Falcata

+0

如果你在你的第一个代码片段中初始化它后立即运行这个循环,它不应该在第一个元素上崩溃......编辑:你检查了哪个确切的解引用它seg-faulting? – Mysticial

+0

它没有崩溃了......但是如果你能看看这段代码,我会非常感激。我已经在主要文章 – Falcata