
C语言
文章平均质量分 64
宁静以致墨
慢下来,享受技术,找一个安静的位置
展开
-
offsetof 定义
使用实例:typedef struct {const AVClass *class;char *expr_str;AVExpr *expr;double var_values[VAR_VARS_NB];enum AVMediaType type;} SetPTSContext;#define OFFSET(x) offsetof(SetPTSContext, x)#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM转载 2021-09-23 15:38:45 · 1217 阅读 · 0 评论 -
C语言二维数组指针(指向二维数组的指针)详解
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例:int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };从概念上理解,a 的分布像一个矩阵:0 1 2 34 5 6 78 9 10 11但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:二维数组在内存中的存储C语言中的二维数组是按行排列的,也就是先存放 a转载 2021-08-26 17:44:10 · 1383 阅读 · 0 评论 -
memcpy和memmove、memccpy
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count);他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。第一种情况下,拷贝.转载 2021-01-22 09:13:47 · 466 阅读 · 0 评论 -
for 循环的负数问题 以及 h 定义变量
for (uint8_t i = 10; i >= 0; i--){}上面会造成死循环,正确的写法如下:for (int8_t i = 10; i >= 0; i--){}注意有符号和无符号的应用原创 2020-07-24 15:39:14 · 2753 阅读 · 0 评论 -
bps(bits per second)
bps(bits per second)是数据传输速率的常用单位,意思是比特率、比特/秒、位/秒、每秒传的位数。 比特(bit)是信息技术中的最小单位。文件大小(例如文本或图像文件)通常以字节(Byte)为单位。一字节对应八比特。在数据传输中,数据通常是串行传输的,即一个比特接一个比特...”...原创 2020-04-11 10:15:28 · 2286 阅读 · 0 评论 -
__attribute__( at(绝对地址) )
C语言中的关键字__attribute__ ,当时大一学C语言中没有接触过,后来工作中搞RFID的蓝牙标签卡开发,用的是MSP430G2332,直接用的是绝对定位:1 const uint8_t flash_data[TX_PLOAD_WIDTH]@"CARDNO"={0x11,0x22,0x33,0x44,0x55,0x01}; //然后设定CARDNO对应的flash地址,在.xcl文...转载 2020-03-19 18:20:13 · 2093 阅读 · 0 评论 -
指针的大小在MCU为4个字节
typedef struct{ uint8_t * data; uint16_t len;} DATA_MSG_T;sizeof(DATA_MSG_T) 的大小为8,uint8_t * data;其实是4个字节。是指向无符号8位的32位地址。...原创 2020-03-16 17:47:14 · 525 阅读 · 0 评论 -
C语言里面的内联函数(inline)与宏定义(#define)探讨
先简明扼要,说下关键:1、内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。2、内联函数可以调试,而宏定义是不可以调试的。内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline。下面详细介绍一下探讨一下内联函数与宏定义。一、内联函数是什么? ...转载 2020-03-13 09:58:02 · 612 阅读 · 0 评论 -
va_start和va_end解析
int DebugPrint(uint8_t module, uint8_t level, const char *fmt, ...){ int ret = -1; va_list ap; va_start(ap, fmt); ret = PrintInternal(module, level, fmt, true, ap); ...原创 2020-02-23 16:06:33 · 249 阅读 · 0 评论 -
联合体
typedef union{ struct { uint8_t OUT__012:3; uint8_t OUT__345:3; uint8_t Dddd :2; }; struct { uint8_t OUT_0 :1; uint8_t OUT_1 :1; uint8_t OUT_2 :1;...原创 2020-02-22 15:12:52 · 201 阅读 · 0 评论 -
C语言小结 20-01-20
一般说来,volatile用在如下的几个地方:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;volatile限定符用来告诉编译器,该对象的值无任何持久性,不要对它进行任何优化;它迫使编译器每次需要该对象...原创 2020-01-20 16:21:15 · 170 阅读 · 0 评论 -
在.cpp条用.c的文件
extern "C" {#include "stdarg.h"#include "patch.h"}原创 2019-12-26 14:58:42 · 256 阅读 · 0 评论 -
打印16进制的区别
AT_PRINTF("%02X", read_buf[i]); //16进制大写补0^DATALOCK:09E6C70C6DE47601526EB4E8FEF67DE4C93C66F695B8C653A6DC0EC3FC746028AT_PRINTF("%2X", read_buf[i]);// 16进制大写不补0,补空格^DATALOCK: 9E6C7 C6DE476 1526EB4E...原创 2019-12-14 14:35:56 · 353 阅读 · 0 评论 -
C 库宏 - offsetof()
#include <stdio.h>struct address { char name[50]; char street[50]; int phone;}; int main(){ printf("address 结构中的 name 偏移 = %d 字节。\n", offsetof(struct address, name)); ...转载 2019-11-04 16:06:00 · 140 阅读 · 0 评论 -
MDK在原有函数前插入程序 '$Sub$ $ 和 $Super$ $
extern void $Super$$test(void);//自定义代码void test_1(){ printf("test_1 fun\n");}//原函数 void test(){ printf("test fun\n");}void $Sub$$test(void){ test_1(); $Super$$test();}输...原创 2019-10-26 22:24:37 · 577 阅读 · 0 评论 -
\0 字符串的结束标志
'\0'就是 字符串结束标志。%s ,打印Log ,需要添加\0识别字符串的结束。'\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。在数值类型里就代表数字0。数值类型存储时,最高位决定正负号,其他位都为0可不就是0了么?'\0'是转译字符,意思是告诉程序,这不是字符0,我要的是数字0的2进制直接放进来,因为acsii码的0可不是00000000...原创 2019-10-17 13:56:53 · 9374 阅读 · 1 评论 -
ioctl函数的使用方法
int ioctl(int fd, undigned long cmd, ...);由于使用了一连串的“.”的缘故,这个原型在Unix系统调用中显得比较特别,通常这些点代表可变数目的参数表。但是在实际系统中,系统调用不会真正使用可变数目的参数,而是必须具有精确定义的原型,这是因为用户程序只能通过硬件“门”才能访问它们。所以,原型中的这些点并不是数目不定的一串参数,而是一个可选参数,习惯上用char...原创 2018-05-24 11:58:41 · 1259 阅读 · 0 评论 -
strncpy 和strcpy的区别
1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 一般函数原型实现方式: char ...原创 2018-07-10 12:07:38 · 392 阅读 · 0 评论 -
字节对齐的概念
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话...转载 2018-07-23 14:50:56 · 775 阅读 · 0 评论 -
crc16计算
unsigned short sp_crc16_with_init(unsigned short crc, const unsigned char *buf, int size){ unsigned char i; while(size--!=0) { for(i=0x80; i!=0; i/=2) { if((crc&0x8000)!=0)原创 2015-07-13 20:11:45 · 1074 阅读 · 0 评论 -
#undef 的用法及其意义
[cpp] view plain copy #include <iostream> using namespace std; int main() { #define MODI 10 cout << MODI << endl; #undef MODI cout << MODI + 1 << endl; ...转载 2018-04-28 10:17:47 · 9971 阅读 · 1 评论 -
#pragma pack (n)
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。例如,下面的结构各成员空间分配情况:struct test { ...转载 2018-04-27 08:44:21 · 535 阅读 · 0 评论 -
typedef关键字的使用方法
C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE:typedef unsigned char BYTE; 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:BYTE b1, b2; 按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写,但您也可以使用小写字母,如下:t...原创 2018-03-05 19:15:37 · 669 阅读 · 0 评论 -
C 库宏 - va_start()
描述C 库宏 void va_start(va_list ap, last_arg) 初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。这个宏必须在使用 va_arg 和 va_end 之前被调用。声明下面是 va_start() 宏的声明。void va_start(va_list ap, las...转载 2018-03-17 08:18:54 · 294 阅读 · 0 评论 -
snprintf的使用方法
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。1234567891...转载 2018-03-16 19:31:28 · 764 阅读 · 0 评论 -
大小端转换的函数
static inline void endian_swap(void* data, int size){ UHAL_ASSERT((size == 2) || (size == 4) || (size == 8), "no size"); uint8_t* bdata = (uint8_t*)data;原创 2018-02-05 09:01:36 · 3835 阅读 · 1 评论 -
对于复杂函数使用c语言写入的正确姿势
rt = (value*18*1000)/(4096-value);temp=rt/rp;temp=log(temp);//ln(rt/rp) 底数为e log10(temp) 底数为10temp/=bx;//n(rt/rp)/btemp+=(1/t1);temp=1/(temp);temp-=ka;对写入公式是一种思路,从里到外,慢慢 写入rt = (val...原创 2019-03-27 07:48:00 · 305 阅读 · 0 评论 -
C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话...转载 2019-04-26 07:27:49 · 991 阅读 · 0 评论 -
C语言中||的技巧
错误写法if (right() || left()){ Action();}如果前面right() 返回1, 后面的代码将不会执行正确写法r = right();l = left();if (r || l){ Action();}原创 2019-09-04 20:59:48 · 151 阅读 · 0 评论 -
关于双指针的应用
static uint8_t* cur_p_buf = NULL; static uint8_t* last_p_buf = NULL;SwapPingPongBuf(Uart0_Rx_Buf, Uart0_Rx_Buf1, &cur_p_buf, &last_p_buf);void SwapPingPongBuf(uint8_t* buf0, uint...原创 2019-09-04 17:16:11 · 204 阅读 · 0 评论 -
使用vsprinf进行缓冲存储
AT_RESULT_E AtPrintfToBuf(const char *format, ...){ va_list ap; if (g_send_index <= CACHE_SIZE) { va_start(ap, format); g_send_index += vsprintf((char*)(g_send_buf + ...原创 2019-08-28 08:54:00 · 216 阅读 · 0 评论 -
以固定字符分割
C 库函数 -strtok()C 标准库 - <string.h>描述C 库函数char *strtok(char *str, const char *delim)分解字符串str为一组字符串,delim为分隔符。声明下面是 strtok() 函数的声明。char *strtok(char *str, const char *delim)参数...转载 2019-07-22 16:10:44 · 372 阅读 · 0 评论 -
C的静态库
符号和符号表C程序员使用static属性隐藏块内部的变量和函数声明,就像你在java和C++中使用public和private声明一样。每个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。在连接器的上下文中,有三种不同的符号:1)由模块m定义并能被其他模块引用的全局符号。2)由其他模块定义并被模块m引用的全局符号。3)只被模块m定义和应用的局部符号。static...原创 2019-06-18 17:13:51 · 419 阅读 · 0 评论 -
itoa()
#include<cstdlib> #include<cstdio> intmain(void) { intnumber=12345; charstring[25]; itoa(number,string,10);//按十进制转换 printf("integer=%dstr...原创 2019-06-21 19:30:02 · 10490 阅读 · 0 评论 -
extern "C " 的作用
extern "C "只是表示这个可以被C语言调用,除了这个之外,没有什么更多含义。因为C语言的编译器和C++的不同,C++的会有个叫做函数名打散的机制,比如函数:int add(int a,int b)在C++里面编译之后,就不是int add(int a,int b),而是类似:int add@WEROIUERH(int a,int b)的函数名,而...原创 2019-06-04 13:20:20 · 218 阅读 · 0 评论 -
int argc,char *argv[ ] 解析
main(int argc,char *argv[ ])1.argc为整数2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[][] ,argv是一个指针数组) 注:main()括号内是固定的写法。3.下面给出一个例子来理解这两个参数的用法: 假设程序的名称为prog, 当只输入prog,则...转载 2019-06-20 08:59:24 · 4312 阅读 · 0 评论 -
一个二维数组新的定义方式
typedef volatile __attribute__((aligned(4))) uint8_t uac_transfer_t[USBD_CLASS_UAC_BUFFER_SIZE];static uac_transfer_t m_hp_transfers[HP_QUEUE_SIZE];#define HP_QUEUE_SIZE 4#define U原创 2018-01-16 10:33:01 · 1162 阅读 · 0 评论 -
程序编译优化等级说明
•-O0:无优化(默认) •-O和-O1:使用能减少目标文 件 大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用. •-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性能. •-Os:专门优化目标文件大小,执行所有的不增原创 2017-12-14 17:51:19 · 3299 阅读 · 0 评论 -
static volatile的应用
static volatile uint8 _msec = 0xff,tick_cnt = 0,tick_HW_cnt=0;;if (0xff == _msec) { _msec = 0; last_tick = __sys_tick; return; } static volatile 只在编译的时候调用一次 警告问题一定要想好再问,不然会原创 2015-05-06 09:09:34 · 951 阅读 · 1 评论 -
IAR编程环境 _no_init
@是指定地址,__no_init 是一个SEGMENT,是给LINKER用的,定义到不初始化的块中去。@就是指定地址,这个应该没什么好说的了,大部分编译器都这么用。你应该理解这个吧。你定义全局变量的时候比如int char; 即使你没有赋值给他,编译器还是会给他一个初始化值0,编译的时候编译器把他分配到初始化为零的那个SEGMENG中去了。编译器默认的有几个块,初始化为零的块,初始化不为零的块,和原创 2015-07-15 16:53:51 · 2851 阅读 · 0 评论