c 语言
仗剑天涯 回首枉然
想买琵琶却买酒 终不似 少年时
展开
-
常用网站 概述
ProductHunt网:https://www.producthunt.com/CB Insights网:https://www.cbinsights.com/)CrunchBase网:https://www.crunchbase.com/DataFox网:http://www.datafox.com/因果树网:http://www.innotree.cn/199IT网:http://www.199it.com/1.中华人民共和国统计局。2. 中国互联网络信息中心。7.中国互联网数据资讯中心。原创 2023-12-01 16:41:35 · 8914 阅读 · 0 评论 -
Linux c 中malloc 函数 size为0 时 的结果
有些平台 会返回 malloc 能分配的最小空间 来返回 一个指针,只不过这个指针对变量而言 0 字节可用. 有些平台 min size 是 16 有些是24 还有一些是32。在linux c 中我们经常遇到malloc 去动态分配内存问题, 我们知道 malloc 的函数原型时。不一定 应为libc 在定义这个函数时 对于malloc(0) 对于通平台有不通的反应.有的平台 直接认为 size 为0 是 非法的 所以就return 了NULL。如果我们size 为0 那么 他的返回值 会是什么呢?原创 2023-06-16 14:58:17 · 335 阅读 · 0 评论 -
常用网站
我认为,电子设计竞赛不是一个孤立的竞赛,它是同我们电子相关专业的课程密切结合的,是专业课体系化的过程,与培养自身全面素质是紧密相关的。我是资深网站保存爱好者,浏览器分门别类存了应该有几百个网址,关于嵌入式的也有很多,大致按照类别分享下。,覆盖各行各业的智能化解决方案,应用方案可以生产出更多大胆有创意的智能单品,发挥空间会更足。在我看来,电子专业相关的同学参加一些比赛是很有必要的,不单单是一个比赛一次经历。更多的是一种能力,一种态度,与专业结合,用于实践,锻炼实践经验。转载 2023-03-23 14:05:45 · 696 阅读 · 0 评论 -
二层如何避免loop 的产生
在RSTP里面,如果某一个指定端口位于整个网络的边缘,不在于其他交换设备连接,而是直接与终端设备直连,这个端口叫做边缘端口,边缘端口不接受处理配置BPDU,不参与RSTP运算,可以从disable直接转到forwarding状态,并且不经历时延,就像在端口上将STP禁用。指定端口的选举也是首先比较累计路径开销,累计路径开销最小的端口就是指定端口。如果累计路径开销相同,则比较端口所在交换机的桥ID,所在桥ID最小的端口被选举为指定端口,如果还选举不出来,则比较端口ID,端口ID最小的被选举为指定端口。原创 2023-03-04 16:11:04 · 1167 阅读 · 0 评论 -
Linux C 中数组名和结构体变量名代表的含义
这里的a 是一个结构体名称 和数组一样他也指向第一个成员变量(&a 和&(a.a) 相同)。所以 a 代表的是 a.a. 就是对第一个成员变量的访问。// 这里会改变test_main 的值,应为你把test_main 的地址传入了, 我改的是*p 的值 是改这个地址对应的值。a 就是一个传值调用, 在调用函数时 我们会用a copy 一个副本, 所以你在fun中改a 的值 不能该表被调的传入值。比如: int a, a 代表的是一个变量名程,它对应的地址中(&a)存的是一个整形值,原创 2023-02-07 17:08:33 · 585 阅读 · 0 评论 -
linux 中 可变参数 (宏定义中的可变参数和函数的可变参数)
1. 宏定义中的可变参数 :在linux 中红是一个即简洁有使用的 替换工具。 但是 宏替换有许多的 技巧和陷阱,下面我们就其中的一个方面来做一个 介绍 可变参数。#define PRINTF(fmt,args...) printf(fmt,##args) // 注意这是一种 通用的宏定义方法。 这里要注意的是 宏定义中的变量是没有类型的说法的,所以 PRINTF(char *fmt,...原创 2019-08-11 15:57:43 · 1302 阅读 · 1 评论 -
Linux souce code self check program “cppcheck“
在linux 编程中 我们会遇到很多隐藏的 一个 潜在的问题。 比如 内存 overfllow 等, 但是 我们有一个app 可以来检查这些问题。 具体的可以参考 下面这个手册。原创 2022-06-29 19:08:56 · 109 阅读 · 0 评论 -
gcc objcopy 和 ld 的区别
我们再linux 编译中 经常会用到这几个 编译指令: objcopy 和 ld 那么这两个命令 那么这两个命令有什么区别呢.首先我们我们gcc 编译完成后的 .O 文件 是包含有elf 头的 这个头部没有任何实质的指令语句 只有一些编译器的系统信息。首先对于多文件的复杂工程, 工程文件有很多 每个文件都拥有独立的 .bss .text .data 区域 所以ld 的一个作用就是把不同的.o 文件的 各个区域重新 连接起来。 组成一个 可执行的文件。而objcopy 的作用就比较 单一了, 就是再没有操作系原创 2022-06-19 15:32:04 · 455 阅读 · 0 评论 -
Linux sizeof strlen 得到的 个字符串长度 大小
注意strlen 算长度是回把字符长结束符去掉, 但是 字符串结束符是占内存的。 所以sizeof 是算在内的。原创 2022-02-10 19:50:42 · 808 阅读 · 0 评论 -
linux c lib函数strsep 用法
strsep 是lib 函数 ,他的主要作用是分割字符串, 和strtok 的作用相同。但是有区别。我们主要去看一下strsep 的用法, 因为现在好多地方都放弃了strtok先来一个例子char test[64]="7,8,9,";char *p = NULL, *p_str=NULL;char tem[]=",“;int i = 0;p_str=test;p=strsep(&p_str,tem);while(p ){printf("i=%d====/p原创 2022-02-10 19:40:37 · 914 阅读 · 0 评论 -
linux c 中 二进制变量 八进制变量 十六进制变量的表示方法
二进制: int a=0b101;八进制: int a = 014;十六进制: int a = 0x8;float a =8.99;printf(”%2.1f“,a); 表示打印两位位宽,保留小时位 一位原创 2021-05-26 15:36:46 · 522 阅读 · 0 评论 -
linux strlcpy strncpy strcpy 和 sprintf 以及snprintf strtok详解
再linux 下字符串处理函数尤为重要,下面我们就详细简介一下:a) strcpy(dst,src) 这个函数是不检查边界的,他只把src copy 到dst 中如果 dst 长度不够 就会发生内存践踏,如 strcpy(buf[8],"123456789") 在这种状况下 buf 中存的就是 12345678 而buf 就没有字符串结束符了 \0 这回再字符串打印出现问题。b) strn...原创 2020-04-30 23:44:36 · 620 阅读 · 0 评论 -
linux 中sscanf 和scanf 使用 详解
linux 中和终端交互的函数有很多,比如gets() scanf()等gets() 函数从标准输入读入 直到读到新行符 或 EOF 字符 之前,不会停止度读入文本。也就是:gets() 不检查边界。因此,当变量空间 小于 一行字符知串 时, 使用 gets() 会造成 溢出,程序出错。scanf 就不同了他根据我们提供的format 来读取。需要注意的是 sscanf(buf,"...原创 2020-04-28 23:17:38 · 969 阅读 · 0 评论 -
程序 编译的步骤 预编译 编译 汇编 连接
程序在编译的过程中有一下四部预编译 : 去掉code 的注释# 和 宏定的展开编译: 把c 转化成 汇编语言汇编 : 把汇编编程二进制连接: 给整个程序重新 定义地址,多个.o 连接成一个程序.由此可见 生成库文件时 不需要知道函数的具体定义 只有再程序连接的时候才确定 地址...原创 2020-03-28 23:28:10 · 164 阅读 · 0 评论 -
字节序问题
有网络传输的地方就有字节序问题,字节数问题主要时存在于多字节类型中 单字节没有字节序问题。为什么能因为不同的内存会有不同的存储方式,主流有两种 大端(big endian) 和小端。 大端时 数值的高位存在地址的地位 例如 0x16 78 在int a 中是这样存的 16 78 小端 数值的低位存在地址的地位 例如 0x16 78 在in...原创 2020-03-28 23:22:54 · 618 阅读 · 0 评论 -
makefile 中export set ENV 的区别和作用
在Makefile 中 set ENV 和 export 的作用是一样的都是把 变量开放出去。原创 2020-03-28 23:01:41 · 1349 阅读 · 0 评论 -
宏参数的替换需要注意
在c中我们会大量的用到宏定义, 宏既可以定义变量 也可以定义函数,这里我们讲一下宏中参数替换的 注意电例如 #define TEST_FUN (h) \ h->next = 0;\引用中 我们这样用 struct a; TEST_FUN(&a) // 注意里就错了, 展开后 &a->next !!!!...原创 2019-10-25 23:01:47 · 528 阅读 · 0 评论 -
linux malloc calloc realloc 的区别
最近在做项目是遇到了 realloc 导致的问题,现在我就简单的将一些 这个memory 分配函数的区别。首先要明白一点 他们都是在堆中 分配空间,并且分配的都是连续的空间。malloc 没有什么特别的 就是分配一段连续的地址。calloc 和malloc 不不同的地方在于他分配完以后就会初始化为0realloc 就是在原来的基础上重新分配一段, 这里这主意 如果是减小mem...原创 2019-10-13 16:04:33 · 278 阅读 · 0 评论 -
bash shell 中$(),${}, $[] ,$(()), [ ] , [[ ]], (()) ,``的区别和作用
在bash shell 中 一下符号代表不同的意义: $()和`` 是一组他在shell 中表示的是 命令的替换,就是在shell 中fork 一个子进程 区做 他们 括起来的命令 然后在返回父进程。 特别要注意的是在有system 调用的地方要放这种command的内嵌,是黑客攻击的对象。需要字符串华或者转义,但有一点要注意转义后就不要在字符符串化了。${} 变量替换 就是把变量的真实值...原创 2018-10-22 19:47:40 · 8020 阅读 · 0 评论 -
Linux bss segment, data segment, text segment and stack segment , heap segment introduce
1. Now we study linux compile, we found that when we use "readelf -S" we can read the symbol in the exe. 我们会发现在 在程序中会有 data bss text 和 read data 以及 heap stack 等段的概念。下面我们详细的讲一下个段的存放的那些变量。 text ...原创 2018-09-30 16:44:05 · 347 阅读 · 0 评论 -
fgets 和fread的区别
char *fgets(char *buf, int size,FILE *fd)size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ; fgets --- 字符串读取函数,从制指定的fd中读取 SIZE 长的字符长,如果遇到 \t 或者字符长结束符\0 则结束。fread 读取一原创 2016-03-24 19:40:28 · 1852 阅读 · 0 评论 -
gdb 调试code dump 技巧和方法详解
在linux 编译过程中由于c语言的复杂行导致我们不可能一次写好大工程的代码,经常会出现core dump (有时时内存泄漏或者越界等) 我们怎样快速的排除这些错误呢。gdb 是个不错的工具他可以很快的调试这类错误。 他分两种调试方法 1. 本地调式,2. 远程调试。 今天我们指讲本地调试,远程调试需要安装搭建gdb server 比较麻烦。1. gdb 本地调试:a) ...原创 2019-05-25 17:49:44 · 4163 阅读 · 1 评论 -
linux 中0地址的使用技巧
在C语言中指针时最精髓的东西,但是指针又是一个比较危险的东西 现在我们不讲指针我们制淡轮 指针的初始化。指针的初始化离不开NULL 这个符号。在c中NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值的初始化。对于字符串的结尾,使用'\0',它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值NULL...原创 2019-05-26 18:56:25 · 1210 阅读 · 1 评论 -
offsetof 宏定义的详解
#define offsetof(type,member) (size_t)&(((type*)0)->member)在这里我们解释一下这个宏定义, 0我们知道 和NULL 一样的意思 但是为什莫上面的表达式可以运行, 我们知道操作一个空指针不是会segment fault 吗?这里就要解释一下了 这个宏 并不是时我们想的那样, 因为宏是在 编译时处理的 而指针的引用...原创 2019-05-26 21:26:27 · 573 阅读 · 0 评论 -
linux typedef 和define 宏的区别
在linux中变量的类型很多 有时候不同的平台 存在变量的差异,所以我们就需要在写大型的项目时就需要 给变量定义一个通用的名字。在linux 中有两种方法:1. typedef2. #define例如:typedef int * int32#define INT32 int *这两种定义都可以但他们有本质的区别 ,1.typedef 是在程序编...原创 2019-08-10 01:04:46 · 170 阅读 · 0 评论 -
中断上下文和进程上下文
上下文指的就是 在调度的切换过程就叫 上下文。(这个过程需要保存当前 的一些参数)内核调度的切换就叫中断上下文,他的目的就是获得cpu的调度全,在这里没有进程的概念 整个内核就一个init 进程(多cpu除外)进程上下文 就是指用户进程之间的切换 过程中保存的一些 当前进程的运行参数。下面有个问题: 1. 问什么中断上下文中不能有sleep 首先中断实在内核态下的...原创 2018-10-06 12:51:05 · 663 阅读 · 0 评论 -
linux 中指针和数组
很多人觉得这个问题是没必要去研究的,简单的认为数组就是单指针,在参数传递中是没有区分的,只是在地址连续性上有一点差异。 这种认知本身即是错误的。 例如: char a[4]; char *p;这两个符号在编译时有不同的作用,数组a 和 &a和a[0] 的地址相同。 符号a 本身没有地址。他只是一个阅读符号。但是p 不同p是一个指针变量 他有地址,他的地址中存放一个...原创 2018-07-06 21:33:55 · 232 阅读 · 0 评论 -
iptables 命令应用详解
iptables的语法格式及其语法如下:iptables [-t TABLE] COMMAND CHAIN [CHAIN_NUMBER] 匹配标准 -j 执行动作其中-t TABLE指定要编辑的表名,如果此处不写,默认表为filter表COMMAND表示要执行的命令,这些命令包括这几大类: mangment command:原创 2016-12-30 16:06:27 · 461 阅读 · 0 评论 -
linux firewall 浅谈
很早之前就想写一点关firewall的东西,在ip产品的开发中firewall使我们无法避免的东西,你想要和ineternet 通信就必须用到firewall。其实firewall 也没有那么神奇, 我们现在所说的iptables 不过是一个上层的app 相当于netfilter的一个configure app。所有关于packets的处理都在kernel中完成的也就是netfilter mo原创 2016-12-30 15:44:50 · 377 阅读 · 0 评论 -
c 中内存对齐问题详解
在c中内存对齐和cpu 有关,下面我们以32为处理器为例来详解:#pragma pack() 这是一个特别的宏 他可以动态的改变对齐基数; c 中数组无论是自对其还是数组对齐 都是已pack 宏和他的最大成员变量 的最小值 为对齐参数。数组对齐原则: 1. 成员是变量 按照自身和pack 最小的值(对齐基数)对齐,及他的开始地址原创 2016-11-03 09:27:50 · 342 阅读 · 0 评论 -
linux 中大小端问题 详解
在linux中关于网络间数据的传输不可避免的要讲到字节序的问题,有些pc在本地的数据存储顺序是高字节放高地址,低字节放第地址,这种字节编码方式叫做 (小端排序), 有些pc在本地的数据排序为 低字节放高地址 高字节放第地址,(这叫做大端)。这里讲的大小端是以字节为单位的,所以只有多字节的类型的变量才有 大小端之说。 低地址指的是从相对0地址开始的, 字节的高低指的是从左到右的顺序 左边原创 2016-05-19 21:06:00 · 494 阅读 · 0 评论 -
c中有关char *p 和char a[6] ,char a[] char a[0] 的区别
指针和数组的却别在于,数组是分配连续的地址,而指针不是,他是指向一个地址char a[] h和char a[0] 是一样的表示可变数组,只能出现在函数参数中(他和指针参数没有不同之处) 和strcut的最末尾处。原创 2015-11-19 22:57:50 · 1893 阅读 · 0 评论 -
c 中有关宏定义的相关问题
宏定义中的 #和## 的意义, # 是字符串话的标志##是强制分割链接字符串如果宏定义总出现了#或者##那么他的参数如果是宏则不以宏展开,函数宏定义,没有实参类型值进行形参替换,具体类型要在调用时确定。原创 2015-11-19 22:51:47 · 423 阅读 · 0 评论 -
c中(),[],{}的作用和用法
()最基本的用法是改变运算的优先级,他还有一个作用是区别函数名和参数,条件表达式的主体和条件。c中允许小口号括起来的语句出现在表达式中。C语言的小括号里面表示一条语句,返回值是多条语句中最靠右的语句的返回值,比如(a=2,b=3,c=a+b),返回值就是c的值[] 表示数组的下标{} 限制程序的作用域(也就是他是复合语句限定的标志),不同的作用域局部变量可以重名,原创 2015-11-22 13:22:31 · 10581 阅读 · 0 评论 -
c 中局部变量问题和复合表达式问题
局部变量是在程序运行时分配的他存在栈区,有些书中讲局部变量的作用域是在函数中,在函数调用时全部入栈,其实这种理解只在c89的标准下是对的,在c99中局部变量是可以在函数的任何地方声明的,他的左右域也可是复合语句 , 下面我们就来了解一下,复合语句和局部变量问题。1. 函数中定义的变量他的作用域只在该函数内。2. 函数的形参属于被调函数的局部变量,而实参则是主调函数的局部变量。原创 2015-11-21 19:53:10 · 698 阅读 · 0 评论 -
c中有关内存分配问题和函数返回值问题
首先我们介绍一下c中内存的分配: 在一个程序编译完成后你可以有size 命令来查看,我们可一看到他存储分为三个区域,代码区域(text) 数据区(data) 和未初始化的全局变量(bss)。 这三个去有着不同的属性和意义, text去一般是read only的一位他存的是cup指令集一般不可更改,data 区存储的是已初始化的全局变量和 静态全局变量和局部静态变量以及字符常量,原创 2015-11-16 21:50:01 · 555 阅读 · 0 评论 -
linux vim .bashrc 配置以及一些常用的linux 命令解析(下)
在上半篇幅中我们主要linux中的一些常用命令,下面我们介绍一下,linux的编辑器vim 和启动项的配置以及linux文件夹的介绍:vim之所以受人青睐主要是由于,他的可扩展性比较好,有许多的灵活的配置。 一般安装vim后在 /etc/vim/下有一个.vimrc 文件这就是vim的root用户配置文件,vim配置文件只对用户有效,因此在你的用户下也应该有一个.vimrc文件的。这个原创 2015-11-09 21:41:56 · 14185 阅读 · 0 评论 -
Makefile 中 -wl ,rpath 以及 O0 O1 O2 O3 Os 的用法
再makefile中一般默认的 lib 的加载路径是/lib /usr/lib 如果想要改变程序运行时的libs的加载路径 就需要用到 -wl , rpath 参数来添加lib 加载路径。O0 O1 表示在不影响编译速率的前提下尽可能的优化程序的大小和运行速率。O2 表示在牺牲部分编译速率的前提下 支持配置优化参数的优化 尽可能的提高运行速率。O3 表示 采取多项量算法原创 2017-02-24 10:32:21 · 10666 阅读 · 0 评论 -
execl 和system的区别
在c中又时候需要执行一个shell或者bin 时候 就需要用到system 或者execl 函数系类。 那么我们怎样来选这个函数能?execl 这个函数系列 他会代替调用它的程序 执行完成后 不会回到主调程序中 直接用新的execl create的shell替代了 原来的程序。system 这个函数不同 他会fork一个子程序中 但他会在主调程序中等待 system的返回。 相当原创 2017-02-24 14:09:23 · 4032 阅读 · 0 评论 -
linux c vlan tag 技术详解
两个问题开始本文章:1. 什么是vlan? vlan 全称 virtal local area netwok 明白没? 就是虚拟的lan 侧的局域网络。2. 为什么需要vlan ? a) 我们知道在router中我们可以通过nat 吧不同ip 段之间的相互通讯(丢弃一些自己不需要的packets 如mutilcust packets)。而在二层的交换机上 如何 实现原创 2017-09-11 20:22:27 · 2038 阅读 · 0 评论