C
理论结合实践逐步精进C语言应用
编码小哥
嵌入式系统研发工程师
展开
-
其实解决问题的方法很简单
其实,一开始运行的时候,报错日志就给出了答案,并不需要这么大费周章地调试,debug就像生活一样,有时问题看似很复杂,其实回过头来看一看,答案就在眼前。本例是一个动态数组的例子,实现数据的增加、删除、根据索引修改数值、获取数值。,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步!运行一下在当前目录下生成core文件。gdb结合core文件调试。原创 2024-05-16 03:08:31 · 478 阅读 · 0 评论 -
递归算法实现进制转换
【欢迎关注编码小哥,学习更多实用的编程方法】原创 2024-01-20 11:30:07 · 735 阅读 · 0 评论 -
十六进制转换成八进制的两种方法
【欢迎关注编码小哥,学习更多实用的编程方法】原创 2024-01-20 10:14:23 · 809 阅读 · 0 评论 -
十进制数转换成二进制、八进制、十六进制
【欢迎关注编码小哥,学习更多实用的编程方法】2、十进制转换成十六进制。3、十进制转换成八进制。1、十进制转换成二进制。原创 2024-01-18 21:20:07 · 636 阅读 · 0 评论 -
八进制转换成二进制、十进制、十六进制
【欢迎关注编码小哥,学习更多实用的编程方法】3、八进制转换成十六进制。1、八进制转换成二进制。2、八进制转换成十进制。原创 2024-01-18 21:19:45 · 477 阅读 · 0 评论 -
二进制转换成八进制、十进制、十六进制
【欢迎关注编码小哥,学习更多实用的编程方法】1、二进制转换成十进制。2、二进制转换成八进制。3、二进制转换成十六进制。4、字符串转换成整型。原创 2024-01-16 21:35:07 · 440 阅读 · 0 评论 -
基于UDP的网络编程
【代码】基于UDP的网络编程。原创 2023-12-29 06:00:00 · 967 阅读 · 0 评论 -
memset和bzero性能分析
首先,我们需要了解bzero和memset的功能。bzero是一个宏,用于将一块内存区域的内容设置为0。它的原型如下:其中,s是要设置的内存区域的起始地址,n是要设置的字节数。memset是一个函数,用于将一块内存区域的内容设置为指定的值。它的原型如下:其中,s是要设置的内存区域的起始地址,c是要设置的值(以整数形式表示),n是要设置的字节数。接下来,我们可以通过以下代码来比较bzero和memset的性能:运行结果:1MB512KB256KB128KB。原创 2023-11-19 12:16:58 · 250 阅读 · 0 评论 -
bzero和memset的区别
因为这两个参数的类型是相同的(size_t通常定义为unsigned int类型),编译器并不能发现这个问题,然而bzero函数却不会出现这个问题。尽管在POSIX.1-2001标准里面,bzero函数已经被标记为了遗留函数并不推荐使用,但是很多程序员仍然选择使用bzero而非memset,主要的理由是:bzero只需两个参数,相比memset的三个参数更容易记忆,降低了出错的可能性。- 缺点:只能将内存区域清零,而不能设置为任意指定的值。(1)若s指向的地址是char类型的,c的值可以是任意字符值;原创 2023-11-14 22:02:14 · 357 阅读 · 0 评论 -
看门狗怎么用
看门狗(Watchdog)是一种计算机程序,用于监视其他程序的运行状态。当被监视的程序出现异常或长时间未响应时,看门狗会触发一个事件,通知系统采取相应的措施,如重启被监视的程序或终止其运行。原创 2023-11-14 12:26:27 · 324 阅读 · 0 评论 -
mmap如何运用
然后,创建一个足够大的空文件,并将其全部映射到内存中。接着,创建相同数量的线程,其中一半执行写操作,另一半执行读操作。需要注意的是,由于mmap涉及到底层的内存管理和文件系统操作,因此使用不当可能会导致程序崩溃或者其他严重的问题。mmap是C语言中的一个系统调用,它允许程序将一个文件或者其他的对象映射到进程的地址空间。要使用mmap,你需要包含<sys/mman.h>头文件,并且调用mmap()函数。flags参数指定映射的行为,可以是MAP_SHARED、MAP_PRIVATE等值的组合;原创 2023-11-13 23:02:00 · 611 阅读 · 0 评论 -
C语言中的位域
位域,或称位段,是C语言中的一种特殊结构体成员,允许我们按位对成员进行定义,指定其占用的位数。这种特性使得位域在存储和处理某些数据时非常高效,比如多个开关变量仅需要存储0或1的情况。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。位域把一个字节中的比特位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。原创 2023-11-10 08:12:49 · 91 阅读 · 0 评论 -
实现高并发Web服务器(C语言版)
这个示例中,服务器会监听8080端口,当有客户端连接时,会创建一个新的线程来处理客户端请求。这样可以实现简单的高并发Web服务器。要实现一个高并发的Web服务器,可以使用C语言结合多线程技术。原创 2023-11-09 19:55:45 · 334 阅读 · 0 评论 -
C内存管理
如果内存分配成功,realloc()函数会返回一个新的指针,指向新分配的内存;在这个例子中,我们首先从用户那里获取一个整数n,然后使用malloc()函数动态分配一个大小为n的整数数组。常用的动态内存分配函数有malloc()、calloc()和realloc()等。3. realloc()函数:用于重新分配之前由malloc()、calloc()或realloc()等函数分配的内存空间。需要注意的是,在使用完动态分配的内存后,应该使用free()函数将内存释放,以便其他程序可以使用。free(arr);原创 2023-11-09 05:16:15 · 204 阅读 · 0 评论 -
C编程调试方法
我们在用不管是C还是其它语言编写代码的时候,使用过的调试方法(1)最简单粗暴的方法,使用printf打印某个(些)变量的值,验证是否是我们想要的结果(2)有时候用肉眼很难检查出潜在的bug(特别是遇到段错误的时候),使用linux自带的调试工具gdbgdb 可执行文件名(如果带参数)r 指定参数 回车运行可以单步调试s(step)或者n(next),它俩的区别是n(next)...原创 2019-10-07 16:43:32 · 309 阅读 · 0 评论 -
C语言数组学习(4)
指针数组:<存储类型> <数据类型> *<指针变量数组名>[大小]e.g. int *a[2];指向 int 型的指针数组,有2个元素的一维数组,每个元素都是一个一级指针,指针数组名就是该指针数组的首地址,即指针数组名指向该指针数组。...原创 2022-04-30 22:01:10 · 1088 阅读 · 0 评论 -
C语言标准输入和输出
标准输入输出函数scanf printfprintf 由头文件声明printf (“格式串”列表)格式串:%【修饰符】格式字符printf ("%#xd\n",a) 打印0x等%hd短整型/%d/%c/%s/%f/%lf/%ld/%0x/%0X/%oprintf正常打印满足条件:(1)程序正常结束(2)缓存区满(3)fflush(stdout)刷新(4)\n清缓存区 for(i=0;iwhile(1)死循环宏定义 EOF -1去掉输入垃圾方法:原创 2020-12-31 23:49:25 · 925 阅读 · 0 评论 -
C语言数组学习(1)
数组不能整体赋值,不能对数组名赋值例如a={1,3,5,7}这是错误的写法定义数组的时候,大小必须确定,不能是变量(即使变量已经赋值),必须是常量数组代表整个数组,数组名存放的是第一个元素的地址,数组名是一个地址常量以%p打印地址变量在运行的时候确定大小,定义数组时候不能是变量,获取时候可以是变量,e.g:a[i]省略下标必须全部初始化,同类型的数组不能比较大小数组元素部分赋值时,没有赋值的元素打印的是随机数定义一个整型数组并进行初始化:int a[4]={1,3,5,7原创 2020-12-31 23:56:06 · 135 阅读 · 0 评论 -
关于fork
#include#include#include#includeint main (int argc,const char **argv){int i;for(i = 0;i {fork();//printf ("&\n"); //这种情况下,输出6个"&"printf ("&"); //这种情况下,输出8个"&"}ret原创 2017-07-30 20:27:48 · 153 阅读 · 0 评论 -
getopt
getopt()是用来分析命令行参数的。argc和argv分别代表参数个数和参数。optstring为选项字符串,告诉getopt()要处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,optarg 即会指向所跟参数后面的参数。如果遇到了不符合optstring指定的其他选项,getopt()将显示“?”字符。#include #inc原创 2017-11-30 23:06:48 · 234 阅读 · 0 评论 -
C语言数组学习(3)
字符数组:由若干字符型变量组成,形式如下:char cc[6];字符数组初始化:(1)为每个元素赋值char cc[3] = {'a','b','\0'}(2)使用字符串常量赋值char cc[3] = {"ab"}字符串以\0结尾,初始化字符数组时,千万注意内存访问不可越界。数组与指针:数组名是地址常量,而指针是地址变量数组是由有一定顺序关系的某些元素的集合数组指针是一个指针,其指向数组起始地址的指针,一维数组的数组名是一维数组的指针*(a+6)即取指针a后原创 2021-01-31 23:15:22 · 250 阅读 · 0 评论 -
C语言数组学习(2)
一维数组和多维数组一维数组和多维数组的区别:下标不同,一维数组只有1个下标,多维数组有2个或者2个以上的下标二维数组的初始化:按行初始化int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}省略行下标给数组初始化int b[][2] = {{1,2},{3,4}}按线性存储方式给数组初始化int c[2][2] = {1,2,3,4}二维数组的内存是连续的,按行存储,一行一行地存举个例子:int a[3][4]3行4列数组 a[0][原创 2021-01-26 23:13:41 · 99 阅读 · 0 评论 -
C++与C语言的区别
C++和C有两大区别:(1)设计思想不同(2)语法规范不同一、面向过程的语言1.自顶向下的设计思想将大程序分解为小程序,如果分解后的程序仍然过大,继续分解2.结构化编程反映了过程性思想将问题分步解决,根据问题的操作思想解决问题3.尽管提高了清晰性、可读性,但还是有不少缺点的程序的模块化仍然会导致混乱,相似的问题需要不同的代码实现,给代码维护带来困难二、面向对象的语言1.用客观世界中描述事物的方法描述一个程序要解决的问题。2.引入对象和类的概念对象属性原创 2020-12-15 08:25:42 · 8596 阅读 · 0 评论