目录
题目
一、如下那些函数属于可重入函数 ?
//A
int tmp1 = 0;
struct test1(int *a, int *b){
tmp1 = tmp1 + *a;
*a = *b;
*b = tmp1;
}
//B
struct test2(int *a, int *b){
int tmp2 = 0;
tmp2 = tmp2 + *a;
*a = *b;
*b = tmp2;
}
//C
struct test3(int *a, int *b){
static tmp3 = 0;
tmp3 = tmp3 + *a;
*a = *b;
*b = tmp3;
}
//D
int *p = NULL;
struct test4(int *a, int *b){
p = malloc(100);
free(p);
}
二、如下对弹性数组定义正确的是?
//A
struct a{
int num;
int data1[];
};
//B
struct b{
int num;
int data2[1];
};
//C
struct c{
int data3[2];
};
//D
int num;
int data4[9999];
三、如下的赋值方式对吗?
char str[] = "hello world";
四、左移运算符和加号运算符谁的优先级高?
int f(int n){
return n << 1 + 1;
}
int main(){
printf("%d\n",f(2));
return 0;
}
背景概念梳理
可重入函数
可重入的定义:若一个程序或子程序可以“在任意时刻被中断,然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(reentrant或re-entrant)的。
一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
可重入函数应满足的条件:
1,不含有静态(or 全局)非常量数据
2,不返回静态(or全局)非常量数据的地址
3,只能处理有调用者提供的数据
4,不能依赖于单实例模型资源的锁
5,调用的函数必须也是可重入的。
不可重入函数应满足的条件:
1,函数体内使用了静态的数据结构
2,函数体内调用了malloc或者free函数
3,函数体内调用了I/O函数
弹性数组
定义:定义数组时,没有指明其长度,此为弹性数组
使用条件:
1,弹性数组只能存在于结构体中
2,弹性数组必须为结构体中的最后一个成员
3,结构体最少有一个非弹性数组的成员(结构体不能全都是弹性数组)
4,编译器需要支持C99标准
数组名是常量?
数组名不允许被赋值并不是因为数组名是常量,而是因为数组名被规定了不可以被赋值。
数组的地址和数组首元素的地址是不同的概念,尽管二者的值是相同的。
左移运算符与加号运算符
左移运算符的计算方式:左移运算符就是在 二进制 的基础上对数字进行平移
左移优先级小于加号优先级
解题过程
一、选项A含全局变量;选项C含义静态数据变量;选项D含有malloc及free。选项B中都是局部变量,符合可重入函数的条件。
二、选项B指明了数组长度,定义的不是弹性数组;选项C,没有包含非弹性数组的成员;选项D定义的弹性数组没有放在结构体当中。
三、错误,因为不允许向数组名赋值。
四、正确的理解是2 << (1+1), 2<<2。转换为二进制是0010 -》 1000,及2的3次方,即8。
正确答案
一、选项B
二、选项A
三、错误
四、8
整体代码
无
参考链接
可重入函数 - 简书什么是可重入函数 可重入的概念 若一个程序或子程序可以“在任意时刻被中断,然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(reentra...https://www.jianshu.com/p/2c8de98bf0db一文理解可重入函数 - 知乎1 前言 最近在公司维护的项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误——在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致中断丢失和系统位置错误…https://zhuanlan.zhihu.com/p/280711576C:弹性数组——flexible array - 知乎一. 定义定义数组时,没有指明其 长度,此为弹性数组。二. 使用条件弹性数组只能存在于结构体中,并且必须满足如下条件: 弹性数组必须为结构体的最后一个成员;该结构体必须包含一个非弹性数组的成员;编译器需要…
https://zhuanlan.zhihu.com/p/93811576彻底弄懂C语言数组名_一株禾的博客-CSDN博客_c语言数组名转自:https://blog.csdn.net/Kwansy/article/details/78488222 先定义一个一维数组int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };1一、数组名是什么数组名的值是数组首元素的指针常量。 数组名不是指针,但大多数使用到数组名的地方,编译器都会把数组名隐式转换...
https://blog.csdn.net/chuhe163/article/details/80795728数组名的值是常量吗? - 知乎如图所示,copy函数中的target和source都是指针,为什么调用时可以用数组b和a的名代替他们?代替之后,b…
https://www.zhihu.com/question/362426690