![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 64
绛洞花主敏明
研究生在读,喜欢刺激有挑战。
展开
-
几种TCP连接中出现RST的情况( 比较详细)
总结,本文讲了几种TCP连接中出现RST的情况。实际上肯定还有无数种的RST发生,我以后会慢慢收集把更多的例子加入这篇文章。转载 2024-06-19 11:25:41 · 18 阅读 · 0 评论 -
tcp链接中的三次挥手是什么原因
这时服务端应⽤程序如果有数据要发送的话,就。原创 2024-06-01 14:34:19 · 879 阅读 · 0 评论 -
IP地址转换函数inet_addr(),inet_aton(),inet_ntoa(),inet_pton()
inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!(2)第一个函数尝试转换由strptr指针所指向的字符串,并通过addrptr指针存放二进制结果,若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0.参数 cp:传入的ip地址;原创 2023-03-15 00:00:32 · 2114 阅读 · 0 评论 -
tcpdump工具的使用
tcpdump转载 2023-03-03 18:52:48 · 540 阅读 · 0 评论 -
error: expected declaration specifiers or ‘...’ before ‘(’ token
c语言错误原创 2023-02-28 22:56:54 · 3690 阅读 · 0 评论 -
c语言的大小端问题
大小端原创 2023-02-25 01:00:19 · 413 阅读 · 0 评论 -
Makefile 宏定义 -D传参数
c语言转载 2023-02-17 00:31:50 · 2082 阅读 · 0 评论 -
态库、静态库之间的相互嵌套
动态库原创 2023-02-15 00:06:07 · 565 阅读 · 0 评论 -
c语言指针的强制类型转换
c指针类型转换原创 2023-01-08 00:05:38 · 1394 阅读 · 0 评论 -
c语言中指针赋值出现段错误
c指针原创 2023-01-06 23:20:36 · 612 阅读 · 0 评论 -
linux-c使用inotify监控文件
监控转载 2022-12-06 23:00:09 · 955 阅读 · 0 评论 -
c语言进程间通信
进程间通信转载 2022-12-04 23:32:30 · 388 阅读 · 0 评论 -
c语言malloc不初始化,为什么没有占用系统空闲内存
c语言malloc原创 2022-11-24 22:12:36 · 626 阅读 · 0 评论 -
cppcheck的安装与使用
c语言检查转载 2022-11-22 00:13:04 · 2344 阅读 · 0 评论 -
char str[] 和char *str 的区别
c语言基础知识点原创 2022-06-09 23:38:54 · 291 阅读 · 0 评论 -
VScode 中 Clangd 使用
1、VScode 中 Clangd 使用VScode 中 Clangd 优缺点优点占用系统资源确实比 C/C++ 少了很多,无论是 CPU 还是 内存的使用。(最重要)缺点操作相较于 C/C++ 确实也繁琐一点。总结一下,就是对于大型项目来说,使用 clangd 能够明显降低系统资源的占用,能够减少出现系统卡顿的情况,不过使用门槛较高。C/C++ 更适合小项目的开发,使用起来更加便利,能够更好的进行调试。2、VScode 中 Clangd 使用Linux 下 clangd 安装操转载 2022-04-30 20:34:08 · 6580 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(一)(静态库链接顺序问题)
初衷工作中经常会碰到不同平台之间移植代码,项目中引入各种开源库,经常会碰到很多奇怪的编译、链接问题,这里做一下整理,尽量包含常见的大部分问题。首先我们来关注一下链接顺序引发的问题。静态库链接顺序问题最常见的问题正常情况下(每个静态库之间没有相互依赖关系),静态库之间链接顺序是不需要关注的,但是如果两个库之间存在相互的调用,就会出现链接问题,看一个例子(头文件只声明函数,不再贴出)://lib_a1.c#include "lib_a1.h"int a1_fun(){ retur转载 2022-04-14 22:52:39 · 1191 阅读 · 0 评论 -
C语言extern和static
一、extern与函数先来理解2个概念:外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。二、static、extern与函数的总结1.static在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能在其定义所在的文件中使用。原创 2022-04-14 00:19:56 · 1656 阅读 · 0 评论 -
C语言中extern的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这转载 2022-04-12 19:46:33 · 1386 阅读 · 0 评论 -
c语言中不定参数的使用
1、使用以下三个函数可实现不定参数#include<stdarg.h>void va_start(va_list ap, last);type va_arg(va_list, type);void va_end(va_list ap);《1》、va_start该函数用来初始化指针变量ap(va_list实际是void类型),之后处理参数就默认从ap开始处理。last一般为传过来的参数列表的第一个参数。《2》、va_arg该函数就是将ap指针按照type类型向后移动,然后返回a原创 2022-04-09 18:20:46 · 1498 阅读 · 0 评论 -
ftok()函数深度解析-以及msgsnd、msgrcv、msgget等函数
一、ftok函数关于ftok函数,先不去了解它的作用来先说说为什么要用它,共享内存,消息队列,信号量它们三个都是找一个中间介质,来进行通信的,这种介质多的是。就是怎么区分出来,就像唯一一个身份证来区分人一样。你随便来一个就行,就是因为这。只要唯一就行,就想起来了文件的设备编号和节点,它是唯一的,但是直接用它来作识别好像不太好,不过可以用它来产生一个号。ftok()就出场了。ftok函数具体形式如下:key_t ftok(const char *pathname, int proj_id);其中参数f转载 2022-03-30 21:12:37 · 967 阅读 · 0 评论 -
vscode函数跳转环境搭建
之前读书学习时,代码量比较小,装个C/C++插件就可搞定,但面对比较大的工程,只安装这个插件就不起作用了,就需要建立符号链接。1 基础环境C/C++”插件“C/C++”插件是来自微软官方的 C/C++ 插件,必备的插件,是代码跳转、自动补全、代码大纲显示等功能的基础。2 GNU Global工具global管理工具分为两部分:vscode的gun global插件本地的global工具1、GNU Global插件工具GNU Global是实现函数跳转的基础工具,VSCode中提供了“C转载 2022-03-28 23:05:38 · 7884 阅读 · 2 评论 -
指针数组和二级指针
一、二级指针和指针数组的关系1、二级指针:存放一级指针变量的地址;2、指针数组:是一个数组,数组成员为一种类型的指针变量。实例:#include <stdio.h>#include <stdlib.h>int main(void){ char *array[4] = {"caa", "dvc", "e3c", "mcn"}; char **p = array; printf("%s\n", p[0]); printf("转载 2022-03-15 23:24:17 · 492 阅读 · 0 评论 -
C语言中的结构体指针赋值问题
在对数组或者接收到的数据进行赋值时,往往因为结构体中含有指针而无法获取接收到的数据,那么如何才能获取结构体中的指针指向的内容呢?这就涉及到两个部分的内容。1、通过memcpy()赋值或者对数据进行结构体的强制类型转换,其中的指针如何指向?以下通过一个实际的例子进行解析typedef struct { /* data */ int a; int b; void* c;}test;int main(int argc, char const *argv[]){原创 2022-03-10 22:03:39 · 8167 阅读 · 0 评论 -
C语言中指针数组做函数形参,数组指针做形参
一、C语言中的数组指针与指针数组首先我们需要了解什么是数组指针以及什么是指针数组,如下图:int *p[5]; //指针数组int (*p)[5]; //数组指针那么两个之间有什么区别呢:数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int (*p)[5]即为一个数组指针。int *p[5]则是一个大小为5且存放整型指针的数组。那么也可以理解为数组指针是指向数组的指针,其中数组中存放的还是指针原创 2022-03-09 20:43:06 · 9854 阅读 · 2 评论 -
C语言二级指针和二维数组
一、原理看一下这个C代码输出什么?#include <stdio.h>int main(){ int array[5][4] ={{1,2,3,4},{11,12,13,14},{21,22,23,24},{31,32,33,34},{41,42,43,44}}; int** p = array; printf("%d\n",*p); printf("%d\n",array[0][0]); return 0;}array 是一个二级数组p转载 2022-03-08 23:40:07 · 1158 阅读 · 2 评论 -
C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。正文:首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅):[原文开始]可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: voi原创 2022-03-08 20:24:04 · 16348 阅读 · 0 评论 -
c语言指针强制类型转换
概要:C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。例如,定义如下:int a; float b;double c; long double d;(假设它们所占的字节分别是4、8、8、10,而且连续存储于某个转载 2022-03-07 23:32:48 · 8426 阅读 · 3 评论 -
为什么gdb显示的函数地址和nm不一样?
今天在linux上调试代码的时候,突然发现里面的函数地址gdb 和什么不一样纳米 显示。 (可执行文件是静态链接的。)我认为它们显示的地址应该是相同的,因为它们都是逻辑地址。但是今天的发现让我很困惑。有人知道他们不同的原因吗?我编写了以下简单程序来说明我遇到的情况。void fo() { return ; } void foo()转载 2022-01-17 01:23:29 · 523 阅读 · 2 评论 -
c程序如何根据地址获取函数名(addr2line)
38.1 前言之前有做过一个通过截取内核信号,获取程序出错所在函数位置信息(如段错误),然后进行栈回溯的功能(之前的blog有写),那个虽然成功了,但仍有一些不合人意的地方。就是手动回溯结果显示的只是函数地址,如果要看是哪个函数,那还要用objdump或addrline工具用地址找到是哪个函数,比较麻烦。最近折腾了两天时间,终于搞定了根据地址自动获取函数名称的功能。不管gdb还readelf或addrline工具,可以简单轻松的敲一下命令就可以把函数名及地址整齐地打印展现出来,那么它们是怎么实现的呢??转载 2022-01-16 23:08:44 · 2803 阅读 · 1 评论 -
c程序运行对应内存分布关系
程序运行时的内存分区主要分为BSS段、数据段、代码段、堆、栈。BSS段:Block Started by Symbol,一般是指存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。数据段:data segment,一般是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:code segment/textsegment,通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为原创 2022-01-16 22:23:33 · 242 阅读 · 0 评论 -
addr2line 动态库
一、导读Backtrace中,一般都只有一些地址。但是利用addr2line这个工具,就可以找到对应的代码行。前提条件是可执行程序或者动态链接库编译的时候带-g选项。具体来说,分两种情况:如果关注的一行backtrace位于一个可执行文件中,那么直接addr2line -e <executable> <address>如果关注的backtrace位于一个动态链接库中,那么麻烦一些,因为动态链接库的基地址不是固定的。这个时候,首先要把进程的memory map找来。在L原创 2022-01-16 15:14:18 · 5067 阅读 · 1 评论 -
C程序中调试程序的方法汇总
1、在学习c语言编程中往往只能通过打印来定位错误,这种方式往往效率比较低,这也自己在写程序中一个比较头疼的问题,在知乎上找到了个调试的方法,这里搬运过来,原作者在这一、Core dump调试什么是core dump对于程序,由于各种异常或者 bug,导致在运行过程中,并且在满足一定条件下,产生一个叫做 core 的文件。通常情况下,core 文件会包含了,程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。许多程序出错的时候,会产生一个 core 文件。通过工具分析这个转载 2022-01-15 14:31:57 · 947 阅读 · 0 评论 -
C语言中pthread_cond_wait 详解
一、pthread_cond_wait函数的原理pthread_cond_wait()用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它 pthread_cond_wait() 必须与pthread_mutex配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线转载 2021-11-16 23:41:16 · 28830 阅读 · 5 评论 -
C语言的线程属性-理解
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离转载 2021-11-13 21:57:33 · 303 阅读 · 0 评论 -
win7下安装openSSH
win7下安装openSSH1、下载openSSH下载,那当然需要去权威的地方下载,这里提供github发布版https://github.com/PowerShell/Win32-OpenSSH/releases2、使用cmd命令安装openSSHstep.1 解压到C:\Program Files 据说官方要求放在这个目录下,跟着做就是了ps 如果只是客户端使用,而不需要作为服务端,则到此为止。进入C:\Program Files\OpenSSH-Win64下,启动cmd即可执行ssh转载 2021-09-09 21:31:29 · 2830 阅读 · 0 评论 -
gdb调试c语言的命令和其用法
除了上述命令之外,还包括的命令包括:一、list列出源代码list,在提示符下打入list,会出现一部分源代码,接着按回车会重复上一次命令。使用help list命令 查看list命令:(1) list 10 – 以第10行为中心显示(2)显示main函数 list main(3)列出10-15行的源代码 list 10,15二、终止正在调试的程序kill监视值变动watch expression监视值被读rwatch expression(基本同上)在运行时打印变量.原创 2021-01-31 13:54:30 · 307 阅读 · 0 评论 -
浅析linux的命令行的参数getopt_long函数
前言在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt、getopt_long、getopt_long_only函数来解析命令行参数。一、关于命令行参数命令行参数可以分为两类,一类是短选项,一类是长选项,短选项在参数前加一杠"-",长选项在参数前连续加两杠"–",如下表(ls 命令参数)所示,其中-a,-A,-b都表示短选项,–all,–almost-all, --author都表示长选项。他们两者后面都可选择性添加额外参数。转载 2021-01-28 22:56:40 · 545 阅读 · 0 评论 -
__attribute__((packed))的使用
一、attribute((packed))1、__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的 -----非紧凑模式:编译器有字节对齐的自动优化例如:int main(void){ cout<< sizeof(struct str_struc转载 2021-01-24 22:34:13 · 3667 阅读 · 0 评论 -
C语言中结构体的位域(bit-fields)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct 位域结构名{ 位域列表转载 2021-01-24 22:08:02 · 1204 阅读 · 0 评论