C语言笔试题日记 2021/12/10

这篇博客记录了四道C语言笔试题的解答,涉及函数指针数组、位操作(设置和清除位)、绝对地址访问以及动态内存管理。在嵌入式系统中,动态分配内存可能引发内存泄露和碎片问题。文章提到FreeRTOS操作系统如何解决这些问题,并建议在没有内存管理机制的单片机上避免使用malloc和free,推荐使用环形队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。

解答:这一道题主要容易错的地方就是:函数指针、指针数组。

int (*a[10])(int);

举一反三

2、给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。

解答:这道题清除a的bit3,使用“&=~”的方法。

#define BIT3 (0x1 << 3)
static int a;
 
void set_bit3(void) 
{
    a |= BIT3;
}
void clear_bit3(void) 
{
    a &= ~BIT3;
}

3、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。

解答:这一问题测试你是否知道为了访问一绝对地址,把一个整型数(绝对地址)强制转换为一指针是合法的。

int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;

举一反三

4、下面的代码输出是什么,为什么?

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}

5、尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?

解答:动态分配将不可避免会产生问题:

  • 内存泄露:内存泄露通常是程序自身编码缺陷造成,常见的 malloc内存后没有free等类似的操作, 系统在运行过程当中反复的malloc,吃掉系统内存,造成内核OOM,将某个进程需要申请内存的杀死而退出。
  • 内存碎片:内存碎片是一个系统问题,反复的malloc和 free,而free后的内存又不能马上被系统回收利用。这个是因为负责动态分配内存的分配算法使得这些空闲的内存无法使用,这一问题的发生,原因在于这些空闲内存以小且不连续方式出现在不同的位置。

笔者点评

        FreeRTOS实时操作系统,里面文件 headx.c有内存回收机制,所以在嵌入式设备MCU内嵌FreeRTOS实时操作系统。当malloc、free完之后,内存回收机制就会自动回收内存,把碎片内存重新恢复如新,用户可以放心使用malloc、free。

        但是,普通的单片机,没有像FreeRTOS里面的 headx.c 内存回收机制的话,就会产生上述所说的内存泄漏内存碎片问题,所以此种情况,不建议使用malloc、free的诸如单链表或双链表,笔者建议使用环形队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值