
C 编程
文章平均质量分 66
C 编程
hjjdebug
西方用26个字母表示世界,计算机用0,1两个数字表示世界,大道至简!
人类用6号元素碳来思考, 计算机用14号元素硅来演算,精妙绝伦!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux 下argv参数表所在的内存位置在哪里?
摘要:本文通过测试代码和gdb调试分析了Linux下命令行参数的内存位置。结果显示,argv参数表及其指向的字符串都位于栈区。测试程序输出参数地址后,通过/proc/pid/maps确认这些地址属于栈空间范围(0x7ffffffdd000-0x7ffffffff000)。研究发现,加载器会在栈区创建完整命令行字符串(用0分割为token),并在栈下方建立argv指针表。这验证了命令行参数及其指针表均由栈区存储的结论。(150字)原创 2025-07-09 10:11:01 · 740 阅读 · 0 评论 -
c语言命令行参数解析函数 getopt_long() 使用
本文介绍了C语言中解析命令行参数的getopt_long()函数使用方法。通过示例代码展示了如何定义短选项(如"hi:")和长选项结构体数组(如{"help",no_argument,NULL,'h'})。函数支持三种参数类型:无参数、必需参数和可选参数。文章详细说明了函数原型、选项字符串规则、长选项数组定义、返回值含义以及相关全局变量(optarg、optind)。测试案例验证了-h/--help、-i/--input等选项的解析效果,并指出未定义的-o选项会导致错原创 2025-06-23 19:38:47 · 803 阅读 · 0 评论 -
c语言命令行参数解析函数 getopt() 的使用
摘要:本文介绍了C语言命令行参数解析函数getopt()的使用方法。文章包含测试代码示例,展示了如何定义无参数选项(-a)、必选参数选项(-b value)和可选参数选项(-c[value])。重点解析了optstring格式规则、函数返回值含义及全局变量optarg/optind的作用。通过实例演示了命令行参数解析过程,并指出getopt()会自动将非选项参数移动到argv数组末尾的特性。代码执行结果显示,可选参数选项必须采用"-cvalue"格式而不能用"-c value&原创 2025-06-23 17:46:56 · 564 阅读 · 0 评论 -
c/c++ 汇编码中的.cfi 指令有什么用途?
1. 几个简写词.2. 看一个简单的测试代码:3. 生成汇编代码:4. 分析.cfi 指令5. 小结:原创 2025-06-12 15:04:12 · 1099 阅读 · 0 评论 -
递归与循环的互换性
2.什么是递归?2.1 破除递归的神秘性!2.2 递归函数的执行过程.3 递归函数举例.3.1 简单的循环,怎样用递归表示3.2 连加, 循环与递归算法3.2 阶乘, 循环与递归算法3.3 费波那伽, 循环与递归算法原创 2025-06-10 14:59:33 · 939 阅读 · 0 评论 -
从elf文件动态加载的过程解释got,plt及got.plt,plt.sec
1. 概念定义2. 测试源码3. 外部函数调用对应着 .plt.sec 中的一小段代码,4. .got.plt 将来存储实际的外部函数地址, 开始存储.plt中对应地址5. plt 节对应一小段代码,即以槽号为参数,调用地址解析函数.把真实外部地址存入.got.plt表原创 2025-05-23 17:47:13 · 1127 阅读 · 0 评论 -
浮点数 NaN 彻底研究(linux 下 c环境测试)
1. 创建一个NaN 数据,2. 打印一个NaN 数据,3. NaN 到底等于二进制的多少? 即它是怎样表示的?4. 1.0/0.0 生成的是什么? 是一个无穷大 inf5. 运算时生成一个nan, 用-1开平方 , 竟然生成了负不存在6. nan 的运算和判断isnan()原创 2025-03-11 17:29:24 · 612 阅读 · 0 评论 -
深挖elf文件中弱符号引用
0. 前言1. 弱引用符号是怎样形成的?1.1. 源代码, 测试代码及Makefile2. 弱引用符号的作用.3. 弱引用符号在elf 文件中是怎样表示的.原创 2025-03-06 15:58:56 · 961 阅读 · 0 评论 -
pthread_once_t 类型 和 pthread_once 函数
1. 测试代码2. 运行结果, 达到目的.3. 代码分析3.1 pthread_once_t 就是个李鬼, 它就是int 类型3.2. pthread_once 是libc 的库函数, 如同pthread_create, pthread_join 函数一样.原创 2025-03-05 09:51:20 · 821 阅读 · 0 评论 -
linux 下 signal() 函数的用法,信号类型在哪里定义的?
signal 是linux 下最基础的进程通讯机制.__sighandler_t signal(int signum,__sighandler_t handler);1. 第一个参数signum描述了信号类型, signum的宏定义在哪里?2. 第二个参数handler描述了与信号关联的动作,它可以取以下三种值:除了signal函数,还可以调用sigaction函数, 它的功能更强.原创 2024-11-07 15:10:43 · 532 阅读 · 0 评论 -
cpu 信息的获取(c代码)
1. 如果用c 获取cpu 个数呢?推荐get_nprocs()2. 获取cpuid,做为机器的唯一性标识,只能用内联汇编原创 2024-08-08 10:23:12 · 1058 阅读 · 0 评论 -
free() 从哪里知道释放的内存大小.
小结:实际上系统为每块分配的内存加了一个16字节的头部信息. 并把最终的大小按16字节对齐长度用8字节就够了,但系统保留了16字节长度中bit0的1 其是没什么意义.由于有以上过程,所以你申请的内存大小并不完全等于头部记录的大小, 记录的总比你申请的要大一点点.所以你就不用斤斤计较为什么我申请的内存大小与头部记录的大小不是完全想等的了.原创 2024-07-25 11:42:14 · 689 阅读 · 0 评论 -
errno 是个啥?
1. errno 是一个宏,2. errno 是一个函数调用返回的整数值.3. __errno_location() 是个啥?4. errno 是一个全局变量吗?不是,它是线程变量.5. 怎样得到errno 对应的错误信息? strerror(errno).6. errno 在系统中是如何定义的?7. errno 的应用实例参考.原创 2024-07-14 11:00:55 · 839 阅读 · 0 评论 -
计算机中浮点数表示float 与 double
默认float 及 double 均输出6位数值。//%f 与 %lf 输出一样,精度可到15位。原创 2024-05-22 11:17:08 · 222 阅读 · 0 评论 -
c语言bit位定义--位域的分配是怎样的?
little-endian位域的分配是把最先定义的bit位分到了最低位的bit上, 把最后定义的bit放到了最高位的bit上.编译器认为bit位跟外部包装它的unsigned int 没有半毛钱关系, 你认为有关系,它认为那是强加给它的,它不承认原创 2024-03-29 14:42:47 · 706 阅读 · 0 评论 -
带semaphore的buffer 应用实例
这是一个项目的缩减版.该项目内容是以一个恒定的码率去发送文件. 项目运行的很好,但是当在文件所在磁盘大量长时间 copy 文件时, 由于有大量磁盘读写操作,干扰了以恒定码率发送文件. 出现码率抖动. 意味着画面可能会卡顿.所以需要在外边包上一个外壳, 让外面的这个线程专门去抢磁盘资源, 放入缓存.则内层可以以恒定码率读取缓存,完成发送.这里对缓存的管理就引入了一个重要概念.gSemBufObj 对象. 带semaphore的缓存的管理对象.经实验效果不错. 分享这个模型代码以飨读者.原创 2024-03-18 10:25:35 · 787 阅读 · 0 评论 -
线程的通俗解释
1. 什么是线程? 2. 线程函数长得什么样? 3. 为什么要使用线程.4. 线程控制. 4.0 线程的执行和挂起 4.1: 线程中的互斥操作 4.2: 线程中的同步操作 4.3: 为什么不用全局变量作线程间控制变量? 4.4: 全局变量在线程同步或互斥中没有立足只地吗? 4.5: 线程的创建与销毁原创 2024-03-17 17:33:27 · 721 阅读 · 0 评论 -
创建线程时指定线程属性,调整线程优先级
//用attr 来创建thread, 设置线程优先级//查看指定进程各线程优先级$ ps -p 8996 -T -o tid,comm,rtprio//查看所有线程优先级$ ps -e -T -o tid,comm,rtprio | grep -v -原创 2024-03-12 13:01:05 · 614 阅读 · 0 评论 -
获取秒值, 把秒值转换为时分秒, 及把时分秒转换成秒值代码
获取秒值, 把秒值转换为时分秒, 及把时分秒转换成秒值// 使用就这么简单.// 有时候程序输出需要打印时间信息, 就可以这么干了.原创 2024-03-01 15:36:04 · 381 阅读 · 0 评论 -
c/c++中 qsort 与 bsearch 算法的使用
二进制搜索一个key, 在BASE地址, 元素个数NMEMB, 元素大小SIZE,比较函数__COMPAR。* 由于这个表是我们人类方便查阅的方式给出的,为了编程的需要,先把它按月份名称的ascii顺序排序,bsearch 二分搜索方法,是需要一个排序的数组的,所以先排序数组,然后让bsearch 搜索key。bsearch 在/usr/include/stdlib.h 中定义, 就在qsort 函数的上方。qsort 用来排序,bsearch用来搜索,是这个意思,但具体怎样使用呢?原创 2023-12-13 17:58:10 · 699 阅读 · 0 评论 -
sizeof 与 strlen 用法的简明解释
1. strlen() 是函数, 程序会根据传入的指针计算字符串的长度,不带尾部0.2. sizeof() 不是函数, 其括着的部分可以是变量或类型或字符串,把它也叫参数吧, gcc 会计算出参数所需占用的内存的大小.原创 2023-11-15 09:54:27 · 126 阅读 · 0 评论 -
linux 下用posix semaphore 解决资源竞争问题实例
让10个线程竞争5个资源,用semaphore 来实现1. sem_init(信号量,num) 初始化资源数2. 每个线程要 sem_wait(信号量) 申请资源,申请不到会等待3. 用完要sem_post(信号量), 归还资源原创 2023-09-20 09:54:59 · 328 阅读 · 0 评论 -
linux 应用中offsetof ()是个啥?
//总结: linux 应用中 offsetof 是在stddef.h 中定义的一个宏//#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)原创 2023-09-13 13:43:21 · 257 阅读 · 0 评论 -
linux 下输出彩色字符串
地球人都都知道, \e是转移,其值8进制是\033,十进制是27,16进制是1B。\033[1m 设置高亮度。\033[30m----\33[37m 设置前景色。\033[40m----\33[47m 设置背景色。\033[0m 关闭所有属性。中间[和m之间的数值为属性,其意义主要就是上面介绍的.4ym 设置,x,y取值为0-7。//红字绿底,hello world。原创 2023-07-27 11:40:34 · 543 阅读 · 0 评论 -
linux 下va_start,va_end,va_arg,va_list这些宏到底是什么?
// va_start,va_arg,va_end,及 va_list 都是__builtin_ 内置变量// 都依赖于编译器的实现, 成了黑箱操作了.//// 在简易内核linux0.11 上 , va_*操作并不是黑箱操作,而是显示定义的.如下:// va_list args: va_list被定义成char *, 即args 为一个char *// va_start(args,para)初始化 args 为第一个参数地址+1. 下一个参数地址// va_arg(args,type),原创 2023-07-27 11:01:02 · 755 阅读 · 0 评论 -
qsort 使用举例
/第1参数:数组地址, 第2参数:数组个数,第3参数:数组元素大小,第4参数:比较函数。int cmp(const void *a,const void *b) //比较函数只能是这样的声明.//cmp决定顺序, 返回0(第一项在后)原创 2023-07-09 15:51:37 · 181 阅读 · 0 评论 -
errno 5追踪.
再打开文件,看到了35到133的错误号定义,它包含了一个文件 #include -> /usr/include/asm-generic/errno-base.h。打开,我们看到了错误号125 - 133的定义, 还有一个包含文件 -> /usr/include/linux/errno.h。-5, 这种小号的错误值是ffmpeg 把系统错误号取反形成的,原创 2023-06-29 14:36:39 · 465 阅读 · 0 评论 -
linux c语言创建多级目录
/* mkdir 一次只能创建一级目录,怎样创建多级目录. * 用access 判断目录是否已经创建. * 用mkdir逐级创建目录 */#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>int mkdirs(char *path) { char str[512]; strncpy(str, path, 512);.原创 2022-03-08 16:43:46 · 3241 阅读 · 2 评论 -
linux 下的帮助接口argp_parse()实战
", 目前只定义了一个可选参数OPTION_ARG_OPTIONAL, 类型为"NUM", 工作运行良好, 已经可以应付一般的帮助要求了.就是说,库里边定义了argp_program_version变量,但它的值是NULL,如果用户也定义了argp_program_version,并且不为0,我们知道,命令行除了可以带选项,还可以带参数,每当系统分析到参数时,也会回调parse_opt, 并传递key参数为ARGP_KEY_ARG,选项能够改变程序的运行轨迹,而帮助系统需要让用户知道有哪些选项可以使用。原创 2022-10-21 13:27:55 · 1643 阅读 · 0 评论 -
怎样检测程序中有没有使用未初始化的变量?
怎样检测程序中有没有使用未初始化的变量?打开gcc 的 -Wall 选项, 可以静态检查是否使用了未初始化变量.但并不能查出动态的变量(例如变量指针所指的成员变量)是否初始化.下面给一个例子说明该问题.想要检查一些执行时的内存错误,可以借助于valgrind 等内存检查工具...原创 2022-06-12 16:27:52 · 1350 阅读 · 1 评论 -
linux 命名管道创建及使用demo程序
/* demonstrate how to use thread and how to use fifo etc * 1. write thread is main thread * 2. create a read thread * 3. use fifo to commnicate * 4. display processID and threadID */原创 2022-06-08 10:13:28 · 276 阅读 · 0 评论 -
分解命令行字符串为argc和argv
有时候需要用空格把一个命令行参数字符串分解为参数个数和参数指针,就是常见的c语言main 函数入口argc, argv[], 这里采用strtok()函数可以很方便的做到.char *strtok(char *str, const char *delim);用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数str的字符串中发现参数delim中包涵的分割字符时,则会将该字符改为\0在第一次调用时,strtok()必需给予参数.原创 2022-06-03 15:11:17 · 923 阅读 · 1 评论 -
c语言如何将stdin、stdout、stderr重定向到/dev/null
如何将stdin、stdout、stderr重定向到/dev/null网上有这样描述的.close( 0 );close( 1 );close( 2 );open( "/dev/null", O_RDWR );dup( 0 );dup( 0 );我用到的, 由于某程序向stderr中打印了大量信息,我需要把它代码中的stderr重定向为空.下面给一个实例,#include <stdio.h>#include <stdlib.h>#include <原创 2022-05-29 15:27:47 · 1199 阅读 · 0 评论 -
static 变量名称有何特别之处? 为什么可以重名?
问题: static 变量名称有何特别之处? 为什么可以重名?我们拿一段代码研究一下:#include <stdio.h>void fun1(){ static int a=9; a++; printf("%d",a);}void fun2(){ static int a=5; a++; printf("%d",a);}int main(){ fun1(); fun2(); return 0;}其对应的汇编代码如下;000000000原创 2022-05-23 11:13:01 · 1076 阅读 · 0 评论 -
vsprintf 函数研究--可变参数列表
vsprintf 函数研究--可变参数列表函数原型:int vsprintf(char *string, char *format, va_list param);看不懂的就是va_list找一个实例代码做测试, 如下例.$ cat main.cpp#include <stdio.h>#include <stdarg.h>char str[50];/* 这个函数是可变参数的, 其堆栈可以传递很多参数 */int vspf(const char*fmt,原创 2022-05-05 15:25:59 · 620 阅读 · 0 评论 -
c 程序堆与栈,全局变量地址的研究.
c 程序堆与栈,全局变量地址的研究.先来一段简单的测试程序.int main(){ int i=1; int j=2; int k=3; char *p=(char *)malloc(10); printf("global addr gi:%p,gj:%p, gk:%p\n",&gi,&gj,&gk); printf("malloc p:%p\n",p); printf("addr i:%p,j:%p, k:%p\n",&i,&j,&原创 2022-05-02 14:47:42 · 507 阅读 · 0 评论 -
enum 变量的使用及char*数组新式定义
enum 变量的使用及char*数组定义直接上代码, 可以看出, 用enum变量 及等于号可以确定指针所在的位置,如果不用enum变量,按常规定义成 : const char * hw_type_name[]={"cuda","drm",....} 这种方式指针是顺序排放的, 而用enum加=号则按enum 的顺序排放了, 用gdb调试观察hw_type_names 变量可以清楚d看明这一点. cat test.c#include <stdio.h>enum AVHWDe原创 2022-04-15 10:55:20 · 797 阅读 · 0 评论 -
__wrap_malloc 研究
__wrap_malloc 研究即__malloc_hook 不推荐使用后, 用什么办法来在malloc 之前来注入代码呢?gcc/g++ 的链接选项 -Wl,--wrap-malloc 可以解决这个问题. 下面给出一个具体的实例来包装malloc, 包装free, 甚至包装任意一个函数.它的作用是,在调用一个真实的库函数之前, 先调用包装函数.先看一下主体代码, test.cpp中调用了 foo(), malloc(),free()函数.$ cat test.cpp #include原创 2022-04-10 20:34:09 · 2219 阅读 · 2 评论 -
malloc_hook 研究.
研究了一下__malloc_hook, 你可以用man __malloc_hook 获取它的第一认识.原来它是glibc 定义的一组变量(函数指针), 由此而去调用对应的函数, 这就叫hook.把这个hook 定义到哪里,它就会调用到哪里,于是就理解了这个hook, 下面给出一个完成的示例加深理解, 是参考手册写出的代码,调试通过.可以理解为也是一种代码注入手段. 用以检查内存泄露等!源码: cat main.cpp #include <stdio.h>#include原创 2022-04-07 10:22:58 · 3310 阅读 · 0 评论 -
m3u8 文件代码片段.
m3u8 文件代码片段. 备用.//写分片的最大持续时间,分片的序号int write_m3u8_header(FILE *fp, const myoption_t opt) { char write_buf[1024]; snprintf(write_buf, 1024, "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:%05lu\n#EXT-X-MEDIA-SEQUENCE:%d\n", (long)opt.segment_ma原创 2022-02-17 13:25:54 · 891 阅读 · 0 评论