小小弱鸡 2022-03-07 17:08 采纳率: 100%
浏览 30
已结题

C语言结构体和指针的问题。

最近学到操作系统的PV操作,想着自己写代码实现简单的PV操作,遇见了问题。
整个代码为
#include "stdio.h"
#include "stdlib.h"
struct process{  //进程结构体
    long pid;
    long uid;
    struct process *next;
};

typedef struct semaphore{  //记录型信号量
    int value;
    struct process *L;
} semaphore;

void PrintBlockQueue(semaphore S){   //输出阻塞队列
    struct process *p = S.L;
    if(p==NULL){
        printf("NULL\n");
    }else{
        while(p!=NULL){
            printf("%d-> ",p->pid); 
            p=p->next;
        }
        printf("Null\n"); 
    }
}

void block(struct process *L,struct process P){
    printf("\n%d 进程加入阻塞队列\n",P.pid);
    if(L==NULL){
        L=(struct process *) malloc(sizeof(struct process));
        L->pid = P.pid;
        L->uid = P.uid;
        L->next = NULL;
        printf("%d,%d\n",L->pid,L->uid);
    }else{
        struct process *p = L,*q;
        while (p->next != NULL){
            p = p->next;
        }
        q = (struct process *) malloc(sizeof (struct process));
        q->pid = P.pid;
        q->uid = P.uid;
        q->next = NULL;
        p->next = q;
    }
    
}

void wakeup(struct process *L){

}


void wait(semaphore &S,struct process p){
    S.value--;
    if(S.value<0){
        block(S.L,p);
    }
    printf("此时共享资源数量为: %d,此时阻塞队列:",S.value);
    PrintBlockQueue(S);  
}

void signal(semaphore &S){
    S.value++;
    if(S.value <= 0){

    }
}


main(){
    semaphore S;
    S.value =2;  //系统资源
    S.L = NULL;
    
    struct process p1,p2,p3,p4; //4个进程
    p1.pid = 202201; p1.uid =1001;
    p2.pid = 202202; p2.uid =1002;
    p3.pid = 202203; p3.uid =1003;
    p4.pid = 202204; p4.uid =1004;

    wait(S,p1);
    wait(S,p2);
    wait(S,p3);
//    wait(S,p4);
    printf("%d\n",S.L->pid);
}
简单说明,用的C语言语法,但文件后缀是cpp的,因为在函数中用到 void wait(semaphore &S) 里面的&,这是cpp的语法吧,可以把函数里面的数值带回来。
运行结果及报错内容

img

问题:在block()函数中已经把阻塞的进程插入到struct process *L;里面去了,为什么在主函数中输出S.L->pid还是为空呢?

img

是cpp里面的&这个符号不能带回结构体里面的指针吗?
  • 写回答

2条回答 默认 最新

  • Frank_Liuxing 2022-03-07 17:17
    关注

    关键就在这个声明:

    
    void block(struct process *L,struct process P)
    
    

    函数执行完称之后,L指向的内容可以改变,但是L本身不能改变。
    如果要改变L,修改为指针的引用即可:

    
    void block(struct process *&L,struct process P)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月7日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效