【C语言】
玛丽奥ZJY
这个作者很懒,什么都没留下…
展开
-
Linux c学习--从标准输入输出看流和缓冲区
学习标准输入输出,我们都会遇到一个概念,流和缓冲区,但到底什么是流,什么是缓冲区呢? 书《C Primer Plus》上说,C程序处理一个流而不是直接处理文件。后面的解释十分抽象:『流(stream)是一个理想化的数据流,实际输入或输出映射到这个数据流』。这个流具体是一个怎么样的东西呢? 流这个定义非常的形象。我们可以这样理解: 你声明一个FILE *fp ...转载 2018-03-15 09:21:15 · 240 阅读 · 0 评论 -
Linux C 指针练习
题目一、已知数组内容如下 s[] = {1,2,3,4,5,6,7,8,9},输入一个常数 m(1<=m<=9),使得该数组内容顺序后移n个位置。如n = 3时,数组后移3个位置后的内容为{7,8,9,1,2,3,4,5,6}代码如下: #include <stdio.h> int main(){ int a[] = {1,2,3,4,5,6,7,8,9}; int b[...转载 2018-03-15 09:20:43 · 194 阅读 · 0 评论 -
字符串按照单词为单位逆序排列
我们前面已经写过一个简单字符串逆序排序的方法,这里再开一个字符串排序问题:给定一个字符串“I love China”,编写程序完成以单词为单位的逆序,如"China love I",并要求不使用第三方变量保存数据,但可以使用辅助指针变量这道题如果没有“要求不使用第三方变量保存数据”则很轻松,当然这里字符串肯定要用一个数组进行存放的,意思是不能再定义一个数组存放排列好的字符串,那样的话就太简单了。具...转载 2018-03-15 09:20:36 · 630 阅读 · 0 评论 -
Linux C编程---指针数组简析(二维数组、多级指针)
讲到指针和数组,先给大家看一道例题:题目:填空练习(指向指针的指针)1.程序分析: 2.程序源代码:main(){ char *s[]={"man","woman","girl","boy","sister"};char **q;int k;for(k=0;k<5;k++){ ;/*这里填写什么语句*/ printf("%s\n",*q);}}指向指针的转载 2018-03-15 09:20:49 · 297 阅读 · 0 评论 -
linux C --深入理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度、拷贝字符串、比较字符串等;当然现在的C库中为我们提供了很多字符串处理函数。熟练的运用这些函数,可以减少编程工作量,这里介绍几个常用的字符串函数,并编写一些程序,如果没有这些库函数,我们将如何实现其功能;1 求字符串长度函数 strlen头文件:string.h函数原型:size_t strlen(const char *...转载 2018-03-15 09:21:00 · 381 阅读 · 0 评论 -
Linux C 编程技巧--利用有限状态机模型编程
转载:http://blog.csdn.net/zqixiao_09/article/details/50239337 我们知道,一般编写程序时都要画出流程图,按照流程图结构来编程,如果编写一个比较繁琐,容易思维混乱的程序时,我们可以利用有限状态机模型画出一个状态转移图,这样便可以利用画出的逻辑图来编写程序,简洁且不易出错。 那什么是有限状态机是什么意思呢?百度百科上...转载 2018-03-15 09:21:09 · 693 阅读 · 0 评论 -
GCC 命令行详解
1。gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译2。gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。为什么会出现unde...转载 2018-07-04 09:19:15 · 7289 阅读 · 0 评论 -
关于gcc、glibc和binutils模块之间的关系
一、关于gcc、glibc和binutils模块之间的关系1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)...转载 2018-03-07 20:52:32 · 664 阅读 · 0 评论 -
Binutils工具集 解析
对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高。目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器。除了GCC,还有一个非常重要的、同样来自于GNU的工具集(toolchain) —— binutils toolchain。这一工具集中存在的一些工具,可以说是我们开发和调试不可缺少的利器。 Binutils中的工具不少和...转载 2018-03-07 20:45:16 · 452 阅读 · 0 评论 -
变长结构体用法总结
C99允许。结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结转载 2017-05-21 21:03:36 · 1611 阅读 · 0 评论 -
linux下多线程之pthread_detach(pthread_self())
写个碰到的问题,记录下自己的技术之路点滴pthread_detach(pthread_self())linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之转载 2017-04-10 14:35:22 · 243 阅读 · 0 评论 -
在应用层来截获数据链路层的帧并对其处理
目前大多数操作系统都为应用程序提供访问数据链路层的强大功能。这种功能可以提供如下能力:能够监视由数据链路层接收的分组,使得诸如(tcpdump)等程序能够在普通计算机系统上运行,而无需专门的硬件设备来监视分组。如果结合使用网络接口 进入混杂模式(promiscuous mode)的能力,那么应用程序设置能够监视本地电缆上流通的所有分组,而不仅仅以程序运行所在主机为目的地的分组。能够作为普遍转载 2017-04-06 10:28:04 · 1361 阅读 · 0 评论 -
linux实用PF_PACKET接收原始链路层数据包
http://blog.csdn.net/bluesy2008/article/details/89897741.介绍在Linux中提供了PF_PACKET接口可以操作链路层的数据。 2.使用方法定义一个pf_packet = socket(PF_SOCKET, SOCK_RAW, htons(ETH_P_RARP));就可以利用函数sendto和recefrom来读取转载 2017-04-06 10:09:48 · 916 阅读 · 0 评论 -
linux socket 操作链路层
Linux提供最常用的网络通信应用程序开发接口--Berkerley套接字(Socket).它既适用于同一主机上进程间通信(IPC),又适用于不同主机上的进程间通信。套接字的设置通过socket调用完成:int socket(int family,int type,int protocol);其中family指通信域或协议族,Linux系统支持的网络协议族有PF_UNIX,PF_I转载 2017-04-06 10:05:39 · 1186 阅读 · 0 评论 -
Linux C 函数练习
学习函数主要学习的就是函数的声明、定义和调用,下面请看两个例子,来帮助我们学习函数:题目一:编写一个函数iswithin(),它接受两个参数,一个是字符,另一个是字符串指针。其功能是如果字符在字符串中。就返回1 (真);如果字符不在字符串中,就返回0(假)。在一个使用循环语句为这个函数提供舒服的完整程序中进行测试。代码如下:[cpp] view plain copy#include &l...转载 2018-03-14 12:23:05 · 297 阅读 · 0 评论 -
Linux C 预处理详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 //blog.csdn.net/zqixiao_09/article/details/503863211.预处理程序按照ANSI标准的定义,预处理程序应该处理以下指令:#if #ifdef #ifndef #else #elif#endif#define#undef#line#error#pragma#include显然,上述所有的12个预处理...转载 2018-03-14 11:21:11 · 486 阅读 · 0 评论 -
内联函数 —— C 中关键字 inline 用法解析
一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就...转载 2018-03-14 11:08:30 · 162 阅读 · 0 评论 -
linux C 学习---函数指针
我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。 函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索...转载 2018-03-15 09:19:54 · 340 阅读 · 0 评论 -
Linux C学习---递归函数
最近学习到了递归,刚开始看,真是头大,函数里面嵌套其本身,到底是怎么个流程啊?现在,咱们先了解下递归函数的数学原理:高中的时候就出现很多递归函数,应该是在“级数”那里的习题中出现的,而且还不少。还是从例子开始吧: f(x)=f(x-1)+x*x ,其中x>0且f(0)=0求f(4)解: 由于f(0)=0:当x=1 时 f(1)=f(0)+1*1=1;当x=2 时 f(2)=f(1)+2*2...转载 2018-03-15 09:46:14 · 475 阅读 · 0 评论 -
C语言经典编程题--哥德巴赫猜想 、完数 、猜数字等
一、 验证歌德巴赫猜想:任意一个不小于6的偶数都可以表示成两个素数的和。从键盘任意给一个符合条件的数,输出相应的两个素数。素数:指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数代码如下:[cpp] view plain copy#include <stdio.h> #include <math.h> int sushu(int n) {...转载 2018-03-18 11:36:44 · 619 阅读 · 0 评论 -
C/C++经典面试题(持续更新)
面试题1:变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明,不分配内存空间,知道具体使用时才初始化,分配内存空间,如外部变量。面试题2:sizeof和strlen的区别sizeof和strlen有以下区...转载 2018-03-18 11:36:51 · 463 阅读 · 0 评论 -
深入了解scanf() getchar()和gets()等函数之间的区别
scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序:程序1:[cpp] view plain copyint main() { char ch1, ch2; scanf("%c", &ch1); sc...转载 2018-03-18 11:36:59 · 1857 阅读 · 0 评论 -
从getmemery()函数看内存管理、函数传参等一系列问题
在C 面试题目中,会经常出现getmemery()函数的改错题,比如下面这道题,例一:代码如下:[cpp] view plain copy#include <stdio.h> char *getmemery() { char p[] = "hello world!"; return p; } main() { char *str = NU...转载 2018-03-18 11:37:15 · 136 阅读 · 0 评论 -
c头文件(.h)的作用
C语言的著作中,至今还没发现把.h文件的用法写的透彻的。在实际应用中也只能依葫芦画瓢,只知其然不知其所以然,甚是郁闷!闲来无事,便将搜集网络的相关内容整理一下,以便加深自己的理解理论概述:.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。1)h文件作用: 1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明; 2. 使函数的作用域...转载 2018-03-18 11:37:22 · 707 阅读 · 0 评论 -
Linux C 中断言assert()使用简介
assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句,它的作用是终止程序以免导致严重后果,同时也便于查找错误。所需头文件:#include <assert.h>报告错误的条件:assert(0);[cpp] view plain copyvoid ...转载 2018-05-02 22:13:20 · 447 阅读 · 0 评论 -
Linux C 内存管理
提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统中),而且内存分配也会直接影响到程序的效率。因此,我们要对...转载 2018-05-07 22:08:49 · 147 阅读 · 0 评论 -
Linux C 深入分析结构体指针的定义与引用
关于结构体的基础知识,网上书上都一大堆,这里就不赘述了,下面我们要学习的是结构体指针。介绍结构体指针之前,先给大家看一个小程序:[cpp] view plain copy#include <stdio.h> #include <string.h> #include <malloc.h> struct Man { char name[10];...转载 2018-05-07 22:09:02 · 202 阅读 · 0 评论 -
Linux环境下段错误的产生原因及调试方法小结
LZ看到一篇关于Linux环境段错误的产生原因的文章,感觉不错,但不是C博客里面,不知如何转载,这里转贴过来,感谢原博主,文章如下:Linux环境下段错误的产生原因及调试方法小结1. 段错误是什么一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考Answe...转载 2018-05-07 22:09:08 · 228 阅读 · 0 评论 -
Linux C 函数指针应用---回调函数
(这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表了函数的入口地址。当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。 那函数指针在我们实际编程中会起到怎样的作用呢?前一篇关于函数指针的文章...转载 2018-05-07 22:09:20 · 954 阅读 · 0 评论 -
(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack) bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 bss是英文Block Started by Symbol的简称。 bss段属于静态内存分配。 data段: 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内...转载 2017-03-21 10:54:15 · 428 阅读 · 0 评论 -
ELF文件和BIN文件 201
文件的内容:1. BIN文件是 raw binary 文件,这种文件只包含机器码。2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。所以ELF文件的体积比对应的BIN文件要大。文件的执行:1. 执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行; FILE *fp = fopen("vmli转载 2017-03-21 16:13:49 · 376 阅读 · 0 评论