C语言
报恩的猫
码农
展开
-
gdb 调试
(gdb) set args ./ ==> 传参数调试(gdb) break main ==> 在函数main处插入断点Breakpoint 1, main (argc=2, argv=0xbffff684) at ls1.c:1010 if (argc != 2)(gdb) p argc ==> 打印变量转载 2016-10-14 16:04:10 · 485 阅读 · 0 评论 -
va_start和va_end使用详解
1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。2.函数参数的传递原理 函数参数是以数据结构:栈的形式存取,从右至左入栈。 首先是参数的内存存放格式:参数转载 2014-12-21 19:17:23 · 419 阅读 · 0 评论 -
c语言函数指针的理解与使用
1.函数指针的定义 顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:?123A) char* (*fun1)(char * p1,char * p2);B) char* *fun2(char * p1,char * p2);C) char* fun3(char * p1,char转载 2014-12-20 17:22:29 · 457 阅读 · 0 评论 -
动态数组
当写下这个题目的时候,笔者心里其实非常犯难。因为从本质上来说,本章想阐述的内容与题目所宣示的概念,其实是不一样的。在编程中,我们常常要处理一段长度未知的数据,而且,运行过程中长度可能会发生变化,现行的C/C++标准没有提供在栈段和数据段内存中的实现,只提供堆中的实现,例如可以象下面代码那样在堆中分配一段内存,以处理一组长度不确定的整数: int *p = ( int* )malloc( n转载 2014-11-22 15:47:28 · 708 阅读 · 0 评论 -
[]运算符的本质
下标运算符[]一直被作为数组的专有运算符来介绍,经过长年的应用,人们也早已对这个用法习以为常,视为跟每天的午餐一样稀松平常的事情。当你很遐意地写下a[0]表达式的时候,如果抽空回过头来看看标准中关于下标运算符的条款,你很可能会大吃一惊: 6.5.2.1 Array subscripting ConstraintsOne of the expressions shall have转载 2014-11-22 14:11:53 · 483 阅读 · 0 评论 -
c语言实现面向对象编程
介简: Redy的开发语言是C,但在源码中,有很多地方都使用到了面向对象编程的方法,例如:在基本数据类型这一个模块,所有的数据类型都继承robject;在抽象语法树模块,所有的节点都继承astobjct。在linux内核中,也有很多是使用的面向对象方法,在虚拟文件系统,驱动模型中都可以看到。c语言是一种结构化编程语言,以模块工能和处理过程设计为主,实现数据与代码分隔转载 2014-10-08 20:21:16 · 491 阅读 · 0 评论 -
数组的解剖学
C/C++的数组不同于VB等语言的数组,是有层次的,这个层次指的不是维度,而是象俄罗斯有名的套娃一样,一维套一维,亦即数组的嵌套,数组的元素也是数组,VB等语言的数组与之相比更像一个平面。 数组嵌套这个现象从其它语言的角度来看有点奇特,但其实原因也很简单。C/C++的对象模型并不视数组为某种数值的简单集合,而是对象的聚集,每个元素都是一个对象。元素为整数对象,就是整数数组,为浮点数对象,就转载 2014-11-22 13:53:10 · 457 阅读 · 0 评论 -
数组名是一个指针常量吗?
数组名是一个指针常量这种观点来源于数组名在表达式计算中与指针的结果等效性。例如下面的代码: int a[10], *p = a, *q;q = a + 1;q = p + 1; 在效果上看,a + 1与 p + 1是相同的,这很容易给人一种a就是p的假象,但,这仅仅是假象。鉴于指针常量包含了指针和常量两类概念,我们可以把这个问题分开两部分进行讨论。 一、数组名是指针转载 2014-11-22 13:31:47 · 3014 阅读 · 0 评论 -
重载、重写、隐藏
重载(overload):同一个类中名字相同但参数列表不同的多个方法之间的关系。关于重载,是我们比较熟悉的了,最常见的就是运用在类的多个构造函数中,看一下 Java 帮助文档,就可以明白这一情况了。而在《Java 解惑》中,作者给出了下面一个谜题:public class Confusing { private Confusing(Object o) {转载 2014-11-20 16:24:30 · 427 阅读 · 0 评论 -
右左法则----复杂指针解析
首先看看如下一个声明: int* ( *( *fun )( int* ) )[10]; 这是一个会让初学者感到头晕目眩、感到恐惧的函数指针声明。在熟练掌握C/C++的声明语法之前,不学习一定的规则,想理解好这类复杂声明是比较困难的。 C/C++所有复杂的声明结构,都是由各种声明嵌套构成的。如何解读复杂指针声明?右左法则是一个很著名、很有效的方法。不过,右左法则其实并不是C/转载 2014-11-19 16:54:03 · 348 阅读 · 0 评论 -
strcpy函数的实现
已知strcpy函数的原型是:char *strcpy(char *dst, const char *src);实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的情况,strcpy该怎么实现1.strcpy的实现代码char * strcpy(char *dst,const char *src) //[1]{ assert转载 2014-11-19 17:07:02 · 1210 阅读 · 0 评论 -
char * const p 和char const *p 和 const char *p
char * const p //常量指针,p的值转载 2014-11-14 20:37:36 · 916 阅读 · 0 评论 -
维度及长度均可任意变形的动态数组
近日,有同事需要设计一个可自由变形的多维数组,苦思数日,不得其解,求助于我。于是我帮他写了一个可自由改变维度及长度的数组ADT。后来想,网上应该也有人需要这种东西吧,何不放到博客上来,让有此需要的朋友也一同来参考参考。于是就将开始的3个函数扩展为20个函数。鉴于时间仓促,源码一定有很多不完善的地方,如果遇到哪些牛人有兴趣对其进行改进,更求之不得了。 我将此ADT称为Dynamic转载 2014-11-19 19:15:47 · 813 阅读 · 0 评论 -
c++多态
c++赋值兼容原则:一个公有派生类的对象在使用上可以被当做基类的对象,反之则禁止。派生类的对象可以被赋值给基类对象。派生类的对象可以初始化基类的引用(指针也一样) 多态的概念: 1:先期联编:能够在编译时就能够确定哪个重载的成员函数被调用的情况 2:后期联编(多态性):系统在运行时,能够根据其参数类型确定调用哪个重载的成员函数的情况多态概念介绍所谓转载 2014-11-19 20:14:49 · 419 阅读 · 0 评论 -
函数指针作用
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表);一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (转载 2016-05-15 22:43:46 · 1652 阅读 · 0 评论 -
typedef与#define的区别
1. typedeftypedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类型的别名。typedef的作用主要有两点:1.1 简化复杂的类型声明简化复杂的类型声明,或给已有类型起一含义明确的别名;如:typedef bool (*F转载 2016-05-15 22:56:52 · 287 阅读 · 0 评论 -
Linux系统调用--getrlimit()与setrlimit()函数详解
功能描述:获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。用法:#include int getrlimit(int resource, s转载 2016-09-07 16:56:35 · 452 阅读 · 0 评论 -
文件描述符和文件表项
同一进程内:多个fd可以指向同一个文件表项。(只有dup才会出现这种情况)多次open出同一个文件,会出现多个文件描述符和多个文件表项,它们的文件偏移量显然是不同步的。多个文件表项可指向同一个i-node节点同一机子的不同进程内:不同进程的fd可以指向同一个文件表项。(只有父进程fork出子进程时才会出现的情况。)可以使用send_fd (但是发送进程会关闭文件转载 2016-08-30 16:37:26 · 527 阅读 · 0 评论 -
shmget - 共享内存
一. 共享内存介绍系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射shm文件系统中的文件实现进程间的共享内存通信。也就是说,每个共享内存区转载 2016-07-30 18:39:19 · 570 阅读 · 0 评论 -
gdb 单步调试
GDB 概述————GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC、 BCB等 IDE的调试,但如果你是在 UNIX平台下做软件,你会发现 GDB这个调试工具有比 VC、 BCB的图形化调试器更强大的功能。所谓 “寸有所长,尺有所短 ”就是这个道理。一般来说, GDB主要帮忙你完成下面四个方面的功能: 1转载 2016-07-29 15:55:30 · 839 阅读 · 0 评论 -
c语言 goto语句
流程图:转载 2016-06-28 17:03:11 · 422 阅读 · 0 评论 -
pthread_exit()和return的区别
pthread_exit()用于线程退出,可以指定返回值,以便其他线程通过pthread_join()函数获取该线程的返回值return,是函数返回,不一定是线程函数哦! 只有线程函数return,线程才会退出exit()是进程退出,如果在线程函数中调用exit,那改线程的进程也就挂了。。。。会导致该线程所在进程的其他线程也挂掉,比较严重转载 2016-06-12 16:38:29 · 4593 阅读 · 0 评论 -
回调函数
对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针A(函数的入口地址)传递给另一个函数,当这个函数指针A被用来调用它所指向的函数时,我们就说这个函数(A指向的函数)是回调函数。为什么要使用回调函数呢?我们先看一个小例子: 1 Node * Search_List (Nod转载 2016-06-06 17:09:05 · 240 阅读 · 0 评论 -
线程同步: 条件变量pthread_cond_t
最近看《UNIX环境高级编程》多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白[cpp] view plaincopy#include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_IN转载 2016-06-12 13:18:45 · 268 阅读 · 0 评论 -
typedef 函数指针
C语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期会遇到很多困 难。typedef是C语言中一个很好用的工具,大量存在于已有代码中,特别值得一提的是:C++标准库实现中更是对typedef有着大量的使用。但很 多初学者对其的理解仅局限于:typedef用来定义一个已有类型的"别名(alias)"。正是因为有了这样的理解,才有了后来初学者在typedef int myint和转载 2016-06-06 15:22:49 · 281 阅读 · 0 评论 -
Linux socket之四:使用POLL机制处理多连接
使用select函数可以处理socket多连接的问题(select的用法参见:http://blog.csdn.net/zhandoushi1982/article/details/5070107),使用POLL也可以实现同样的功能,且调用方式更加简单。原型是:[cpp] view plain copystruct pollfd { int转载 2016-06-08 13:11:03 · 623 阅读 · 0 评论 -
Linux socket之二:面向连接的socket通信实现
socket也即套接字接口,实际上也就是网络上的通信节点。使用者或者应用程序只要连接到socket便可以和网络上任何一个通信端点连接,传递数据。LINUX中,程序员可以不必关心通信协议而专注应用程序开发。根据数据传送方式,可以把socket分成面向连接的数据流通信和无连接的数据报通信。通信过程如下:转载 2016-06-08 13:09:44 · 925 阅读 · 0 评论 -
Linux socket之一:基础函数
总的来说网络程序是由两个部分组成的--客户端和服务器端。它们的建立步骤一般是:服务器端:socket-->bind-->listen-->accept 客户端:socket-->connect Linux系统是通过提供套接字(socket)来进行网络编程的。网络程序通过socket和其它几个函数的调用,会返回一个通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来转载 2016-06-08 12:59:18 · 288 阅读 · 0 评论 -
pthread_create()
pthread_create函数 原型:int pthread_create((pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) 用法:#include 功能:创建线程(实际上就是确定调用该线程函数的入口点),在线程创转载 2016-05-15 23:03:40 · 629 阅读 · 0 评论 -
pthread_exit()
pthread_exit函数 原型:void pthread_exit(void *retval) 用法:#include 功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数转载 2016-05-15 23:05:47 · 379 阅读 · 0 评论 -
线程基本编程——线程函数大全
索引:1.创建线程pthread_create2.等待线程结束pthread_join3.分离线程pthread_detach4.创建线程键pthread_key_create5.删除线程键pthread_key_delete6.设置线程数据pthread_setspecific7.获取线程数据pthread_getspecific8.获取线程标示符pthread_转载 2016-05-15 23:01:10 · 271 阅读 · 0 评论 -
C语言中断处理机制
一、中断机制 1、实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用转载 2014-11-17 15:45:07 · 10078 阅读 · 2 评论 -
typedef int (* func)(int ,int )
先看一下例子:#include "iostream"using namespace std;int add(int a,int b){return (a+b);}typedef int (* func)(int ,int ) ;void main(){func f = add;int n = f(1,2);cout }转载 2014-11-17 15:10:46 · 10553 阅读 · 3 评论 -
带参数的宏定义
带参数的宏定义的一般形式如下: #define () 其中, 是一个标识符,中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。例如: #define SUB(a,b) a-b如果在程序中出现如下语句: result=SUB(2, 3)则被替换为:转载 2014-11-16 09:41:18 · 12643 阅读 · 2 评论 -
sizeof 字节对齐(二)
转载)这两天在写图像的网络发送程序,在与服务器端同步时,老是出错。Debug发现是取buffer中的值时,偏移量与预想的不一致。问题出现在两个struct上。这两个struct定义如下:typedef struct{ unsigned short ID; unsigned short DataSize; char data[506]; unsigned sh转载 2014-11-15 09:57:35 · 430 阅读 · 0 评论 -
双指针问题
看下面一段程序: 环境:VC++6.0 void a ( char *a ) { a++; } void main() {转载 2014-11-15 10:25:27 · 453 阅读 · 0 评论 -
switch的参数类型
switch(expr1)中,expr1是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。因此传递给 switch 和case 语句的参数应该是 int、 short、 char 或者 byte,还有enum。 long,string 都不能作用于swtich原创 2014-11-15 15:00:02 · 579 阅读 · 0 评论 -
指针和引用的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一转载 2014-11-15 11:28:29 · 371 阅读 · 0 评论 -
数组和指针的区别
C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。下面以字符串为例比较转载 2014-11-16 10:42:21 · 370 阅读 · 0 评论 -
静态局部变量
在公司学习了已经三个月了,但是昨天却彻底把老大给气晕了! 他教给我的东西, 我都还给他了... ... 于是,决定把还记得的都写下来,下次不记得查起来也方便点. 局部变量和静态(static) 局部变量有什么不同: 生存期不一样. 局部变量随着被调用的函数销毁而自行销毁, 静态局部变量则会等待整个程序结束才自行销毁. 例子: void转载 2014-11-15 10:20:52 · 563 阅读 · 0 评论