![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c
文章平均质量分 54
c 语言相关
墨一鉴
软件攻城狮
展开
-
malloc(): corrupted top size 解决
在运行程序时突然蹦出 malloc(): corrupted top size 错误 第一次 malloc 的内存,存在越界问题,而且没有报错。第二次 malloc 时,就报了 malloc(): corrupted top size 错误解决这个问题,需要排查第一次 malloc 之后内存越界使用的问题。原创 2022-12-04 11:29:49 · 3033 阅读 · 0 评论 -
Linux内核红黑树(Red-Black Tree or rbtree)算法的实现
平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称 AVL 树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子BF(BalanceFactor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1、0和1。(此段定义来自严蔚敏的《数据结构(C语言版)》)红黑树是一种在插入或删除结点时都需要维持平衡的二叉查找树转载 2022-04-26 23:13:14 · 763 阅读 · 0 评论 -
如何强制 gcc 链接未引用的静态库中的 目标文件
gcc -o program main.o \-Wl,--whole-archive -lmylib \-Wl,--no-whole-archive -llib1 -llib2gcc 链接时会优先链接动态库,没有动态库的情况下会选择静态库。默认只选择静态库中被引用到目标文件进行链接。使用 -Wlm,–whole-archive 选项会强制将整个静态库连接到可执行文件中,-Wlm,–no-whole-archive 是结束标志。参考https://stackoverflow.com/questio原创 2022-01-06 08:00:00 · 1271 阅读 · 0 评论 -
openssl 动态库 libcrypto.so 中的 sm2_decrypt sm2_encrypt 是怎么变成内部函数的
通过查看 openssl 源码,发现 crypto/sm2/ 目录下实现了 sm2_decrypt, sm2_encrypt 函数,于是快乐的编写了调用程序,由于这两个函数的声明不在 include/openssl ,而是在 include/crypto 目录下。编写时头文件写成 #include "crypto/sm2.h"。#include "crypto/sm2.h"#include "openssl/ec.h"int main(){ const EC_KEY *key;原创 2021-10-24 12:53:33 · 3318 阅读 · 9 评论 -
leetcode 报错原因
ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000001d4 at pc 0x0000003a3e3e bp 0x7fffdafb66c0 sp 0x7fffdafb66b8 //越界访问error:stray’\243’ in program //程序中可能有全角字符原创 2021-10-24 10:16:01 · 2103 阅读 · 0 评论 -
strrev 字符串反转函数的实现
//经典实现,效率高char* strrev(char* s){ /* h指向s的头部 */ char* h = s; char* t = s; char ch; /* t指向s的尾部 */ while(*t++){}; t--; /* 与t++抵消 */ t--; /* 回跳过结束符'\0' */ /* 当h和t未重合时,交换它们所指向的字符 */ while(h < t) {转载 2021-10-24 09:54:32 · 191 阅读 · 0 评论 -
GNU 构建系统 autotools
最近下了一个源码包里面 只有 configure.ac 和 Makefile.am ,说明可以通过 autotools 构建系统构建。按顺序执行以下命令即可生成 configure 文件。详细的等以后补充,先用着。aclocalautoconfautoheaderautomake --add-missing./configuremakemake install...原创 2021-10-18 14:01:47 · 233 阅读 · 0 评论 -
文件锁fcntl()函数的使用
文件读锁: 终端1中执行后,将文件锁了,终端2依然能锁住文件,就是说能被两个进程锁住,然后分别解锁,不依赖于另一方的锁和解锁文件写锁:终端1中执行后,将文件锁了,终端2执行时会被提示该文件已经被终端1的进程锁住,终端2的进程会阻塞等待,等到终端1进程解锁,终端2进程 再锁文件问:为什么要使用文件锁?答:当多个用户共同使用、操作一个文件的情况时,Linux采用的方法就是给文件上锁,来避免共享的资源产生竞争的状态。问:文件锁有哪些类型?答:文件锁包括建议性锁和强制性锁。一般情况下...转载 2021-08-27 22:00:54 · 702 阅读 · 0 评论 -
互斥锁pthread_mutex_init()函数
互斥锁pthread_mutex_init()函数linux下为了多线程同步,通常用到锁的概念。posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义,加锁(lock)后,别人就无法打开,只有当锁没有关闭(unlock)的时候才能访问资源。即对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。使用互斥锁(互斥)可以使线程按顺序执行。通常,互转载 2021-08-27 21:50:28 · 1006 阅读 · 0 评论 -
多线程信号处理
子线程会继承父线程的 sigmasksigaction 的作用范围是整个进程,在某个线程中修改,也会影响到整个进程每个线程都有自己的 sigmask,通过 pthread_sigmask 设置,多线程程序中 sigprocmask 行为不确定,推荐使用 pthread_sigmask...原创 2021-08-18 22:02:55 · 315 阅读 · 0 评论 -
C 错误处理
C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。e...转载 2021-08-18 21:49:59 · 105 阅读 · 0 评论 -
-pthread 和 -lpthread 的区别
-pthread 和-lpthread区别就是少了个l, 教材都是在编译的链接的时候要求加下-lpthread 解决链接的问题gcc的官方说明是-pthreadDefine additional macros required for using the POSIX threads library. You should use this option consistently for both compilation and linking. This option is supported转载 2021-08-18 21:16:16 · 1823 阅读 · 0 评论 -
必读基础书单
apueunp原创 2021-08-18 20:53:21 · 134 阅读 · 0 评论 -
C语言变量及其生命周期
变量类型以及作用域和生命周期变量的作用域变量的作用域就该变量可以被访问的区间,变量的作用域可以分为以下四种:进程作用域(全局):在当前进程的任何一个位置都可以访问 函数作用域:当流程转移到函数后,在其开始和结束的花括号内可访问 块作用域:最常见的就是if(...){...},while(..){...},类似这种, 块内部可以访问 文件作用域:在当前源码文件内可以被访问变量的生命周期变量的生命周期就是从创建该变量开始到该变量被销毁的这一段时间,各种变量的生命周期:全局变量:进转载 2021-08-03 22:00:31 · 734 阅读 · 0 评论 -
Linux多线程编程详细解析----条件变量 pthread_cond_t
Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init#include <pthread.h>int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将由cattr中的属性值来决定.转载 2021-07-29 21:38:41 · 1239 阅读 · 0 评论 -
Python/C API
Python/C APIPython/C API可能是被最广泛使用的方法。它不仅简单,而且可以在C代码中操作你的Python对象。这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的Python对象都被表示为一种叫做PyObject的结构体,并且Python.h头文件中提供了各种操作它的函数。例如,如果PyObject表示为PyListType(列表类型)时,那么我们便可以使用PyList_Size()函数来获取该结构的长度,类似Python中的len(list)函数。大部分对Pytho转载 2021-07-21 16:04:57 · 523 阅读 · 0 评论 -
gcc 生成目标文件
gcc 生成可执行文件gcc -o filename main.cgcc 生成动态链接文件Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高。GCC 生成动态链接库如果想创建一个动态链接库,可以使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目转载 2021-07-19 21:26:51 · 1363 阅读 · 0 评论 -
从 C 代码到可执行程序的 4 步之旅
Journey of a C Program to Linux Executable in 4 StagesbyHIMANSHU ARORAonOCTOBER 5, 2011Pre-processing Compilation Assembly LinkingYou write a C program, use gcc to compile it, and you get an executable. It is pretty simple. Right?Have you ever...转载 2021-07-09 23:04:10 · 281 阅读 · 0 评论 -
详解三大编译器:gcc、llvm 和 clang
传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。编译器一般构成传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。GCCGCC(GNU Compiler Collect...转载 2021-07-03 11:34:30 · 2804 阅读 · 3 评论 -
C语言技巧之长度为0的数组
qiuliangflash2013-04-10 23:53:51©著作权在gnu c中有一种用法,就是可以使用长度为0的数组,比如说一下这个结构体:struct sample {int length;char store[0];}可以像以下这种方式来使用:struct sample * example = (struct sample *)malloc(sizeof(struct sample)+size);example->length = size;exam..转载 2021-07-03 11:07:31 · 459 阅读 · 0 评论 -
输入一些数,求第二大的值(不用数组)
#include int main(void){int max,max2,n;scanf("%d",&n);max2 = max = n;while(scanf("%d",&n) != EOF) {if(max { max2 = max;max = n;}else if(max2 max2 = n;}printf("max %d\原创 2014-06-01 14:18:58 · 1069 阅读 · 2 评论 -
printf 输出彩色
printf 输出彩色在ANSI终端下可以显示彩色代码:如 printgf(“33[01;40;32m HELLO 33[01;40;37m”); 能显示绿色的HELLO字样。 printf("\033[0;32mPASSED\033[0;0m\n"); printf("\033[0;31mFAILED\033[0;0m\n"); 这里33[是转义子列,表示后面转载 2014-06-25 15:23:06 · 4288 阅读 · 2 评论 -
判断闰年及给定日期求星期几
判断闰年及给定日期求星期几 1、判断闰年的条件是下面二条之一:1)年份能被4整除,但不能被100整除;如1900就不是闰年2)年份可以被400整除。如2000年就是闰年printf(a%(a%100?4:400)?"NO":"YES");2、给定日期求星期几:C语言根据日期判断星期几(使用基姆拉尔森计算公式)算法如下:基姆拉尔森计算公式W=(d+2转载 2014-05-16 17:35:40 · 1910 阅读 · 0 评论 -
switch变量的作用 域问题
switch是我们做条件选择时,经常用到的一个语句。一直以来对于他的使用相信大家也都是得心应手,前几天在linux下写一个c++程序时遇到了这样的一个问题,请看例子:#includeusing namespace std;int main(){ int i; cout cin >> i; switch(转载 2014-05-05 12:15:05 · 886 阅读 · 0 评论