
C语言
为幸福写歌
热爱编程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
链表
一、数组与链表的比较数组:优点:存取速度快缺点:需要一个连续的很大的内存 插入和删除元素的效率很低链表:优点:插入删除元素效率高 不需要一个连续的很大的内存缺点:查找某个位置的元素效率低二、链表的结构首节点:存放第一个有效数据的节点尾节点:存放最后一个有效数据的节点头结点:头结点的数据类型和首节点的类型是一样的 头结点并不存放有效数据 ...原创 2016-09-11 20:10:01 · 385 阅读 · 0 评论 -
C语言中的strcat()函数
头文件:#include 函数原型:char *strcat (char *dest,const char *src)函数描述:strcat()会将参数src字符串拷贝到参数dest所指的字符串尾,第一个参数dest要有足够的空间来容纳要拷贝的字符串;返回值:返回dest字符串参数的起始地址;例子:#include #include int main(vo原创 2017-11-09 15:22:29 · 23575 阅读 · 1 评论 -
gcc编译error adding symbols错误
编译报错:root@ye:/home/ye/Raccoon# gcc -lxenlight -lxenstore -g a.c store.c read.c -o a/usr/bin/ld: /tmp/ccd7eAsA.o: undefined reference to symbol 'xtl_createlogger_stdiostream'//usr/local/lib/libxenc原创 2017-11-20 10:30:33 · 27368 阅读 · 0 评论 -
sigaction函数及信号集操作函数的使用
信号是与一定的进程相联系的。也就是说,一个进程可以决定在进程中对哪些信号进行什么样的处理。例如,一个进程可以忽略某些信号而只处理其他一些信号;另外,一个进程还可以选择如何处理信号。总之,这些总与特定的进程相联系的。因此,首先要建立其信号和进程的对应关系,这就是信号的安装登记。Linux主要有两个函数实现信号的安装登记:signal和sigaction。其中signal在系统调用的基础上实现,是库函...转载 2018-04-03 10:32:08 · 6735 阅读 · 2 评论 -
结构体在内存中的存储方式
一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include <iostream>using namespace std;struct X { char a; int b; double c; }S1;int main() { cout << sizeof(S1) << endl; cout <&...转载 2018-07-03 21:22:00 · 9830 阅读 · 1 评论 -
C语言中的可变参数(printf的实现原理)
printf是根据格式化的字符来确定的栈中参数的值,长度。在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数...转载 2018-07-03 21:30:32 · 1356 阅读 · 0 评论 -
从源代码到可执行文件(编译链接全过程解析)
程序的生命周期从一个高级C语言程序开始,这种形式能够被人读懂,却不能被机器读懂,为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。在Linux系统下,可用以下指令完成源程序到目标程序的转化:gcc -o hello hello.c main.cgcc 编译器驱动程序读取源文件hello.c和mai...转载 2018-07-03 21:49:27 · 4192 阅读 · 0 评论 -
静态库与动态库的区别
什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:静态库之所以成为【静态库】,是因为在链接阶段,会将汇...转载 2018-07-03 21:27:28 · 5351 阅读 · 0 评论 -
进程创建详解与父子进程资源的管理
1. 父子进程执行顺序问题父进程在使用fork函数创建子进程后父进程与子进程互相不关联,以独立身份抢占CPU 资源,具体谁先执行由调度算法决定,用户空间没有办法干预。子进程执行代码的位置是fork/vfork 函数返回的位置。2. 子进程资源申请问题在使用fork函数创建子进程后,子进程重新申请新的物理内存空间,复制父亲进程地址空间所有的信息,子进程复制父亲进程的代码段,数据段,BSS 段,堆,栈...原创 2018-07-08 23:17:25 · 1645 阅读 · 0 评论 -
多线程pthread_join()的两种作用
pthread_join()函数原型:int pthread_join(pthread_t thread, void **retval);args: pthread_t thread: 被连接线程的线程号 void **retval : 指向一个指向被连接线程的返回码的指针的指针return: 线程连接的状态,0是成功,非0是失败当调用 pthread_join() 时,当...原创 2018-07-03 21:24:16 · 43235 阅读 · 6 评论 -
多线程pthread_join()和pthread_detach()函数的比较
pthread_join()函数:int pthread_join(pthread_t thread, void **retval);args: pthread_t thread: 被连接线程的线程号 void **retval : 指向一个指向被连接线程的返回码的指针的指针return: 线程连接的状态,0是成功,非0是失败当调用 pthread_join() 时,当前线...原创 2018-07-03 21:24:00 · 2020 阅读 · 1 评论 -
C语言中的popen()函数
Linux中的popen()函数可以在程序中执行一个shell命令,并返回命令执行的结果。有两种操作模式,分别为读和写。在读模式中,程序中可以读取到命令的输出,其中有一个应用就是获取网络接口的参数。在写模式中,最常用的是创建一个新的文件或开启其他服务等。头文件:#include 函数原型:FILE *popen(const char *command, const char *type原创 2017-11-08 21:40:41 · 38708 阅读 · 0 评论 -
C语言中mmap()函数的使用
mmap()函数的主要用途有三个:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。头文件: #include 原型:void *mmap(void *start原创 2017-10-19 16:24:30 · 16137 阅读 · 0 评论 -
C语言的常用函数
本文记录的平时遇到的一些函数,这些函数虽然简单但又容易忘掉,所以整理放到这里,方便以后查阅。atoi()函数:头文件:#include原型:int atoi (const char * str);函数说明:将数字字符串转化为相应的数字,读取到非数字字符时将会停止转换。atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspac原创 2017-09-08 15:51:13 · 414 阅读 · 0 评论 -
冒泡排序
冒泡排序比较简单,直接贴程序:/* 2016年9月6日22:17:07 冒泡排序*/#include void sort(int * pArr, int len){ int i, j, t; for(i = 0; i < len-1; ++i) { for(j = 0; j < len-1-i; ++j) { if(pArr[j] > pArr[j+1])原创 2016-09-09 16:33:06 · 285 阅读 · 0 评论 -
指针之动态分配内存
一、动态数组/* 2016年9月4日21:08:23 动态数组*/#include#includeint main(void){ int a[5]; //静态数组 int len; int i; printf("请输入动态数组的长度:"); scanf("%d", &len); int * pArr = (int *)malloc(sizeof(int)原创 2016-09-06 21:08:03 · 541 阅读 · 0 评论 -
C语言中sscanf()函数的用法
本文转载自: http://blog.youkuaiyun.com/sjf0115/article/details/8579935sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.原型: int sscanf (const char *str,const char * format,........);说明: sscanf()会将参数str的字符串根据参数format字符串转载 2017-09-04 21:59:13 · 2352 阅读 · 0 评论 -
C语言中的strdup()和strndup()函数
strdup() 和 strndup() 函数的原型分别为:#include char *strdup(const char *s);char *strndup(const char *s, size_t n);说明:strdup() 函数将参数 s 指向的字符串复制到一个字符串指针上去,这个字符串指针事先可以没被初始化。在复制时,strdup() 会给这个指针分配空间,使用原创 2017-08-28 17:30:28 · 17421 阅读 · 0 评论 -
C语言中的memcpy()和memset()函数
memcpy函数原型:void *memcpy(void *dest, const void *src, size_t n);需要的头文件:#include用法:memcpy函数是内存拷贝函数,功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。因为这个函数是直接操作内存的,所以效率会很高。#includeint ma原创 2017-08-29 11:08:57 · 1601 阅读 · 0 评论 -
Linux中fstat、stat和lstat的用法与区别
stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。struct stat结构体首先隆重介绍的是一个非常重要的”VIP”人物,他是fstat, stat和lstat三者都要用到的一个结构体类型,名字叫做struct stat。可以说,没有这个struct stat的支持,上述三个系统调用将寸步难行。转载 2017-09-07 10:52:01 · 21582 阅读 · 0 评论 -
C语言中time函数和localtime获取系统时间和日期
本文转载自:http://blog.youkuaiyun.com/qq_22122811/article/details/52741483C语言中time函数和localtime获取系统时间和日期time()函数函数说明:可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算。原型: tim转载 2017-09-15 17:17:55 · 2105 阅读 · 0 评论 -
Linux中fork()函数的使用
进程在执行过程中,可以通过系统调用的方式创建多个新进程。Linux系统提供了两种创建进程的方式:函数fork()用来创建一个新进程,该进程几乎是当前进程的一个完全副本;函数exec()函数用来启动另外的进程以取代当前运行的进程。这里主要介绍如何利用fork()函数创建新的进程以及fork()函数的工作机制。fork在英中有“分叉”的含义,在Linux系统中,这个名字比较形象,因为一个进程在运行原创 2017-08-31 15:57:34 · 516 阅读 · 0 评论 -
线性表的顺序表示和实现
最近想利用空余时间把严蔚敏老师《数据结构》里面的算法用C语言都敲一遍,不知道能坚持多久,总之要努力。本文是对《数据结构》线性表的顺序表示和实现这节的算法用C语言的实现,已成功在Linux上运行。线性表的顺序表示的结构和算法就去看严蔚敏老师《数据结构》啦,直接贴代码。#include #include #define LIST_INIT_SIZE 100 //线性表存储空原创 2017-09-26 17:52:22 · 468 阅读 · 0 评论 -
C语言中realloc()的用法
本文转载自:http://www.cnblogs.com/duger/archive/2013/08/29/3288974.htmlrealloc 用过很多次了,无非就是将已经存在的一块内存扩大,如;char* p = malloc(1024);char* q = realloc(p,2048);现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将转载 2017-09-11 16:17:53 · 1932 阅读 · 0 评论 -
C语言中getopt()和getopt_long()函数的用法
一、命令行参数的使用C程序的主函数有两个参数,其中,第一个参数是整型,可以获得包括程序名字的参数个数,第二个参数是字符数组指针或字符指针的指针,可以按顺序获得命令行上各个字符串参数。其原形是:int main(int argc, char *argv[]);或者是:int main(int argc, char **argv);比如在命令行输入:./test hel原创 2017-10-18 22:12:49 · 12919 阅读 · 1 评论 -
C语言内联函数
引入内联函数的目的是为了解决程序中函数调用的效率问题。函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去...转载 2019-06-06 17:19:41 · 1716 阅读 · 0 评论