【问题1】 请用C语言的函数指针变量,对manage_device函数进行改造,完成下面C语言代码中的(1)、(2)、(3)和(4)处的变量说明或语句,将解答填入对应栏内。 【C语言代码】 /*变量与类型说明*/ #include "stdio.h" #include "stdlib.h" extern int sys_status; extern int Dev_drv1(int arg1, int arg2); extern int Dev_drv2(int arg1, iht arg2); extern int Dev_drv3(int arg1, int arg2); extern int Dev_drv4(int arg1, int arg2); #define NOERROR 0 typedef struct { int _fd; {{B}}(1) 函数指针变量说明;/* 变量名用process */{{/B}} } TYP_DEV_TAB; TYP_DEV_TAB dev_tab[50]= {{101, Dev_drv1},{99, Dev_drv2}, {80, Dev_drv3},{120, Dev_dry4},}; /* 程序 */ void manage_device(int devid, int arg1, int arg2) { iht place ; int ret; {{B}}(2) 函数指针变量说明;/*局部变量,变量名用ProcAction */{{/B}} for(place=0 ; place<50 ; place++) { if(dev_tab [place]._fd == devid) { {{B}}(3) 语句1;/* 变量名胜ProcAction, 得到具体函数的入口地址 */{{/B}} break; } } if(place>=50) printf("NO DEVICE fd = %d/n",devid); {{B}}(4) 语句2;{{/B}} if(ret!=NOERROR) printf("DEVICE %d error!", devid); } |
【问题2】 在C语言程序中,常在某些变量的说明前加extem,如本题在变量说明中的第一条加extem int sys_stams;请说明加extem与不加extem的区别,在进行编译时会有什么样的不同处理? |
变量加extern与不加extern的区别 | 在变量志明前加extern,表明为引用一个外部变量,是外部变量引用声明。 如果在一个文件中要引用另一文件中定义的全局变量,就应在变量声明前加extern 不加extern,是在本文件中定义了一个全局变量,同时可被其他文件作为外部变量引用 |
在进行编译时的处理 | 在不加extern外部变量的定义处,编译时要给变量分配地址空间。在加extern外部变量引用声明处,不给变量分配地址 |
【问题3】 函数的参数存放在什么地址空间中?说明其作用范围。将答案填入对应栏内。 |
函数的参数存放地址空间 | 函数的参数存放在进程或任务的栈空间 |
作用范围 | 在调用函数时,给函数的各参数在栈空间分配地址,函数返回时退出栈空间。所以,函数参数在函数被调用时起作用。 |
【问题4】 在设备驱动程序(函数)Dev_drv1中,对指针ptr的说明如下: 【C语文代码】 int Dev_drv1(int arg1,int arg2 ) { struct node { int ID; char name [20]; int range; } ; struct node *ptr; /*其他局部变量声明,略*/ ptr = (struct node *)malloc(sizeof(struct node)*100); /*其他程序代码,略*/ } 设int为32位整数,char占8位。当对指针ptr赋完值后的值为0x3751CO,若再执行一条“ptr++;”语句,此时ptr的值为多少? (用十六进制表示)。 |