蓝牙协议栈中c语言指针笔记

2024-05-15 22:38

本文主要是介绍蓝牙协议栈中c语言指针笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

变长数组

/* Define the header of each buffer used in the Bluetooth stack.*/
typedef struct {uint16_t event;uint16_t len;uint16_t offset;uint16_t layer_specific;uint8_t data[];
} BT_HDR;

BT_HDR* p_buf = (BT_HDR*)osi_malloc(A2DP_SBC_BUFFER_SIZE);
uint8_t* output = (uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len;

这个output最后指向哪里了呢?

做了实验:

#include  <stdio.h>
#include <malloc.h>
typedef unsigned int uint16_t;
typedef unsigned char uint8_t;typedef struct {uint16_t event;uint16_t len;uint16_t offset;uint16_t layer_specific;uint8_t data[];
} BT_HDR;
int main(void)
{
BT_HDR* p_buf = (BT_HDR*)malloc(4096+16);
printf(" malloc %x\n",p_buf);
printf(" malloc %x\n",(uint8_t*)(p_buf+1));
printf("malloc %x\n",(uint8_t*)(p_buf+1) + 3);
printf("malloc %x\n",p_buf->data);
printf(" malloc %x\n",&p_buf->data[3]);
}

执行结果:

malloc 194b010
malloc 194b020
malloc 194b023malloc 194b020
malloc 194b023

这种情况下,p_buf+1就指向了data变长数组所指向的malloc空间了

因此output最后指向p_buf ->data[p_buf->offset + p_buf->len]空间

指针强转位移

int *p = NULL;
int  c[12] = {1};
for ( j = 0;j<12;j++)
{c[j] = j;
}
p =  c;
printf(" %x\n",p);
printf("%x\n",(char*)p);
printf("%x\n",(char*)(p+3));
printf("%x\n",(char*)p+3);
printf("%x\n",p+3);

执行结果:

4e9b8b00
4e9b8b00
4e9b8b0c
4e9b8b03
4e9b8b0c

实现过程 还发现,
不管指针什么类型,指针+n的动作,空间大小的位移都是强转后的类型的大小

这篇关于蓝牙协议栈中c语言指针笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993118

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp