Как сделать указатель на указатель NULL - PullRequest
1 голос
/ 30 ноября 2011

Я пытаюсь сделать последний элемент в массиве указателей 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++;
}

Х считает до 20, а затем падает. Пожалуйста, помогите.


РЕДАКТИРОВАТЬ: Очевидно, последний элемент в списке отправляется на ноль. Я не могу понять, удалит ли этот код последний конверт сообщения из очереди ::

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

Спасибо!

1 Ответ

2 голосов
/ 30 ноября 2011

Ваш луп-тест не меняется:

while (kernel->availMsgEnvQueue->nextMsgEnv) {

Так что это повторяется 20 раз и продолжается ...

Может быть, вы имели в виду это?

while (kernel->availMsgEnvQueue[x].nextMsgEnv) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...