两个C语言题目

第一题 通过结构体成员得到地址,计算结构体首地址
#include <stdio.h>

#define offsetof(TYPE, MEMBER) ¬_____________________________

#define container_of(ptr, type, member) ({\ 
const typeof( ((type *)0)->member ) *__mptr = (ptr);\   
_________________________________________________ );})

struct test
{
    char i ;
    int j;
    char k;
};
int main(){
        struct test temp= {1, 2, 3};
        struct test* temp_ptr;
        int* j_ptr = &(temp.j);
        printf("j 在结构体中的偏移量为:%ld\n", offsetof(struct test, j));
        temp_ptr = container_of(j_ptr, struct test, j);
        printf("temp 的首地址为%p", temp_ptr);
        return 0;
}

第二题 实现一个FIFO
typedef struct {
    int readIndex;
    int writeIndex;
    uint32_t buffer[BUFFER_SIZE];
} FIFO;

static void initFIFO(FIFO *fifo)
{
    memset(fifo->buffer, 0, BUFFER_SIZE);
    fifo->readIndex = 0;
    fifo->writeIndex = 0;
}

static int writeFIFO(FIFO *fifo, uint32_t *data, int len)
{
    int leftLen;//fifo中的剩余容量
    int i;

    if (fifo->writeIndex >= fifo->readIndex)
        leftLen = ______________________________________________
    else
        leftLen = ______________________________________________

    if (len > leftLen) {
        //no space write to fifo
        // reset fifo 
        initFIFO(fifo);
        return -1;
    }
    for (i = 0; i < len; i++) {
        fifo->buffer[fifo->writeIndex] = data[i];
        fifo->writeIndex = ¬¬¬¬¬¬¬¬¬¬¬¬_______________________________________ ;
    }
    return 0;
}

static int readFIFO(FIFO *fifo, uint32_t *data, int len)
{
    int availRead;//fifo中数据长度
    int i = 0;

    if (fifo->writeIndex >= fifo->readIndex)
        availRead = _______________________________________________;
    else
        availRead = ________________________________________________;

    if (len > availRead) {
        //no available length to read
        return -1;
    }
    for (i = 0; i < len; i++) {
        data[i] = fifo->buffer[fifo->readIndex];
        fifo->readIndex =  _________________________________________;
    }
    return 0;
}



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值