C语言中可重入函数、弹性数组数组名非常量、左移优先级小于加号的概念

目录

题目

背景概念梳理

可重入函数

弹性数组

数组名是常量?

左移运算符与加号运算符

左移优先级小于加号优先级

解题过程

正确答案

整体代码

参考链接


题目

一、如下那些函数属于可重入函数 ?

//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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值