【问题标题】:How to make a pointer to a pointer NULL如何使指向指针NULL的指针
【发布时间】: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&lt;AVAIL_MSG_ENV_SIZE; i++){
  • 当然还有while (temp-&gt;nextMsgEnv) {
  • 一些流浪的cmets:(1)当你的意思是前者时,你应该使用AVAIL_MSG_ENV_SIZE - 1而不是19; (2)Msg是否定义为指针类型?如果不是,您应该将malloc 的返回值转换为Msg *,而不是Msg; (3) 你是如何初始化temp的? (我假设temp = kernel-&gt;availMsgEnvQueue[0]?)
  • 我已将您的原始问题重新编辑,以保留原始上下文。

标签: c++ c unix pointers


【解决方案1】:

你的循环测试没有改变:

while (kernel->availMsgEnvQueue->nextMsgEnv) {

所以它迭代了 20 次,并且一直在继续......

也许你是这个意思?

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

【讨论】:

  • 它现在在 1 个元素处给了我一个分段错误... kernel->availMsgEnvQueue[19].nextMsgEnv = NULL;使最后一个元素为 0?
  • 如果您在第一个 sn-p 中初始化它后立即运行此循环,它不应该在第一个元素上崩溃...编辑:您是否检查过它的确切取消引用- 故障?
  • 它不再崩溃了......但是如果你能看看这段代码,我会很高兴......我已经在主帖中添加了一个编辑
  • 它在主帖的编辑中。当我尝试使最后一个元素出队时出现分段错误
  • 你能指出它在新代码中究竟是哪里崩溃了吗?最后一个元素应该有-&gt;nextMsgEnv = NULL,所以它应该进入if语句的第一部分。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多