【发布时间】:2011-11-30 02:56:30
【问题描述】:
我试图将指针数组中的最后一个元素设为 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,然后崩溃。请帮忙。
编辑: 显然列表中的最后一个元素被发送到零。我不知道这段代码是否会从队列中取出最后一个消息信封::
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;
}
谢谢!
【问题讨论】:
-
for(i=0; i<AVAIL_MSG_ENV_SIZE; i++){ -
当然还有
while (temp->nextMsgEnv) { -
一些流浪的cmets:(1)当你的意思是前者时,你应该使用
AVAIL_MSG_ENV_SIZE - 1而不是19; (2)Msg是否定义为指针类型?如果不是,您应该将malloc的返回值转换为Msg *,而不是Msg; (3) 你是如何初始化temp的? (我假设temp = kernel->availMsgEnvQueue[0]?) -
我已将您的原始问题重新编辑,以保留原始上下文。