2011-11-30 81 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