小问题
随心小记
这个作者很懒,什么都没留下…
展开
-
函数返回值
int g = 0;int f(){ printf("In f()...\n"); return g++;}int main(void){ printf("%d\n",f());//函数先返回0,再g++}原创 2017-05-27 08:49:24 · 149 阅读 · 0 评论 -
TCP/IP常见问题
TCP/IP有几层?应用层(ftp,http,dns)传输层(tcp,udp)网络层(ip)链路层(交换机,网卡)OSI分层:应用层表示层会话层传输层网络层数据链路层物理层TCP:面向连接、传输可靠(保证数据正确性和数据顺序)(端到端通信)、用于传输大量数据、速度慢、建立连接需要开销较多(时间,系统资源)UDP:面向非连接、传输不可靠、用于传输少量数据、速度快组播(群播)地址:转载 2017-06-07 12:32:31 · 437 阅读 · 0 评论 -
字符串
在c语言中,双引号引用的单个或多个字符时一种页数的字面量 - 存储于程序的全局只读存储区 - 本质为字符数组,编译器自动在结尾加上’\0’字符char ca[]={'H','e','l','l','o'};编译器不会在末尾加上'\0'字符,输出不确定char ca[]={'H','e','l','l','\0'};正确char ss[]="Hello,World!";转载 2017-05-28 18:42:41 · 190 阅读 · 0 评论 -
数组
数组的类型由元素类型和数组大小共同决定定义数组类型:typedef type(name)[size];数组指针:type (*pointer)[n]; 数组指针: type* pArray[n];//type*是数组中每个元素的类型转载 2017-05-28 19:24:41 · 249 阅读 · 0 评论 -
函数调用
建立一个临时栈帧,用于存放函数参数,参数入栈(esp指向的内存) 函数调用,也就是跳转到被调函数入口地址处 进入函数体内部,执行函数体,执行结束,参数出栈,返回函数返回值,返回原来调用函数的地址处,继续向下执行转载 2017-06-06 22:15:23 · 160 阅读 · 0 评论 -
宏定义函数和普通函数
宏定义函数:预处理阶段进行简单的文本替换,没有入栈、出栈、参数传递和函数返回等等工作,执行效率明显高于普通函数,因此,简短并且被频繁调用的函数经常用宏定义函数来代替实现没有参数检查,会影响程序安全如果函数比较复杂,函数体规模比较大,使用宏定义函数就会增加程序的大小宏定义函数的调用有可能改变函数的原生语义,比如涉及到运算符优先级的函数时,调用宏定义函数可能会改变函数的原生语义,所以使用时要格外转载 2017-06-04 16:21:23 · 5625 阅读 · 0 评论 -
牛客客
一、 数组名可以转换为指向其实体的指针,但是它只能被看作一个指针常量,不能被修改。因此数组名不能作为左值。原创 2017-07-23 10:00:46 · 328 阅读 · 0 评论 -
面试前的一波复习
1、位运算没有短路规则,每个操作数都参与运算 2、位运算的结果为整数,而不是1或0 3、位运算优先级高于逻辑运算优先级 4、位运算符只能用于整数类型 5、左移和右移运算符的右操作数范围必须为[0, 31]。1、逻辑表达式遵从短路规则 2、在&&与||混合运算时:(&&优先级高于||) - 整个表达式被看作||表达式 - 从左向右先计算&&表达式 - 最后计算||表达式 3、逻辑非!转载 2017-08-15 10:44:32 · 164 阅读 · 0 评论 -
剑指OOOOO
1、菲波那切数列:1,1,2,3,5,8…..转载 2017-08-16 17:04:25 · 249 阅读 · 0 评论 -
FH
主要是接收网页的请求:com.fiberhome.platform.controllerHTML:超文本标记语言是一种用于创建网页的标准标记语言。可以使用HTML来建立自己的WEB站点,HTML运行在浏览器上,由浏览器来解析。:声明为HTML5文档 < html>元素是HTML页面的根元素 < head>元素包含了文档的元(meta)数据 < meta charset=”utf-8”> <转载 2017-08-09 14:58:45 · 765 阅读 · 0 评论 -
笔试
1、stdout,输出方式是行缓冲,输出的字符会先存放在缓冲区,等按下回车键时才进行实际的I/O操作 2、stderr:是不带缓冲的,使得出错信息可以直接尽快地显示出来转载 2017-08-26 13:43:03 · 187 阅读 · 0 评论 -
深信夫夫服
shell PATH MMU 虚拟内存 二叉有序树 二叉平衡树转载 2017-06-08 13:49:00 · 201 阅读 · 0 评论 -
内存对齐
CPU对内存的读取不是连续地,而是分成块读取的,块的大小只能是1,2,4,8,16…字节当读取操作的数据未对齐时,则需要两次总线周期来访问内存,因此性能会降低#pragma pck 用于指定内存对齐方式struct占用的内存的大小 - 第一个成员起始于0偏移处 - 每个成员按其类型的大小和pack参数中较小的一个进行对齐(对齐参数) (A) - 偏移地址转载 2017-05-28 10:34:55 · 256 阅读 · 0 评论 -
多线程和多进程的区别
1) 对比维度 2) 多进程 3) 多线程 4) 总结a) 资源共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程资源,资源共享简单,但也是因为这个原因导致同步复杂各有优势b) 内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高线程占优c) 创建销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快线程占优d) 编程、调试编程转载 2017-06-07 10:55:36 · 178 阅读 · 0 评论 -
三次握手
第一次握手:建立连接时,客户端发送syn(同步标志)包到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号第二次握手:服务器接收到同步序列编号包,必须确认客户的SYN,同时发送一个SYN包,也就是SYN+ACK包,此时服务器进入SYN_RECV状态第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器端进入连接状态,完成三次握手转载 2017-06-06 21:30:48 · 196 阅读 · 0 评论 -
mutable和volatile
mutable变量永远处于可变的状态mutable在类中只能修饰非静态数据成员,即使是在const函数中,甚至是const结构体变量或类对象,其mutable成员也可以被修改我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰volatile是转载 2017-06-06 17:04:46 · 399 阅读 · 0 评论 -
前置和后置++
C 语言之规定了++和–对应指令的执行次序 先取值,再执行自增或者自减的操作, 先自增或自减,再取值的操作 ++和–对应的汇编指令不一定连续运行 在混合运算中,++和–的汇编执行可能被打断执行 取值和自增或自减可能被打断 (i++)+(i++)+(i++) (++i)+(++i)+(++i) 不同编译器的汇编指令是不一样的,所以运行结果转载 2017-05-27 10:00:22 · 201 阅读 · 0 评论 -
一行代码实现strlen
int strlen(const char* s){ return assert(s),*s?strlen(s+1)+1:0;}转载 2017-05-27 10:31:49 · 500 阅读 · 0 评论 -
宏与递归
#define Func(n) ((n>0) ? (Func(n-1)+1) : 0) int j=Func(50);被预编译后: int j=((50>0) ? (Func(50-1)+1) : 0); 宏表达式中不能出现递归定义,这点区别于函数,因为宏只做简单的文本替换,且只替换一次,如果出现递归定义,就会无法被完全替换,导致后续编译时原宏名被当作函数;转载 2017-05-28 09:58:41 · 2895 阅读 · 0 评论 -
main
main函数一定是程序执行的第一个函数?不一定,假设我们使用gcc编译器里面的属性关键字(__attribute__),我们就能指定main函数之前执行一个函数,main函数之后执行一个函数,而对于bcc没有扩展的编译器而言,没有属性关键字,main就是程序执行的第一个函数,而对于gcc这种扩展编译器,具有属性关键字,main函数则不一定是第一个执行的函数转载 2017-05-28 19:37:53 · 266 阅读 · 0 评论 -
malloc和free
malloc和free是库函数,而不是系统调用 malloc实际分配的内存可能比请求的多void* calloc(size_t num, size_t size);参数代表所返回内存的类型信息calloc会将返回的内存初始化为0calloc能以类型大小为单位申请内存并初始化为0void* realloc(void* pointer,size_t new size)用于修改一个原先已经分配转载 2017-05-29 09:45:07 · 217 阅读 · 0 评论 -
栈和堆
栈(后进先出)栈在程序中用于维护函数调用上下文(参数,返回地址,局部变量,调用上下文) 栈是一种后进先出的行为 函数中的参数和局部变量存储在栈上每次函数调用都对应着一个栈上的活动记录ESP就是一直指向栈顶的指针 EBP用于函数调用的返回函数调用时,对应的栈空间在函数返回前是专用的 函数调用结束后,栈控件被释放,数据不再有效堆堆是程序中一块预留的内存空间,可由程序自由使用 堆中被程序申请使用转载 2017-05-29 11:17:27 · 306 阅读 · 0 评论 -
指针
char **p,a[16][8];p=a;会导致程序在以后出现问题吗?为什么?p[1][2]和a[1][2]代表一样的意思吗?p=a;如果a[1][2]=1;那么p[1][2]的值是多少?p[1][2]=*(*(p+1)+2)=*(*((char**)&a[0][4])+2);*(p+1)实际上就是a[0][4],a[0][5],a[0][6],a[0][7]等四个元素组成的地址数据,然后转载 2017-05-24 16:26:20 · 153 阅读 · 0 评论 -
函数类型
函数名是执行函数体的入口地址 typedef int (FUNC)(int); int test(int i) { return i*i; } FUNC* pt = test; pt(2)和(*pt)(2)是一样的,但是pt必须是函数指针类型,不能是FUNC pt = test;因为函数名是函数体的入口地址通过函数指针可以转载 2017-05-29 08:52:32 · 329 阅读 · 1 评论 -
僵尸进程
在Linux或Unix中,正常情况下,子进程是通过父进程创建的,而子进程和父进程的运行是一个异步过程,即父进程无法预测子进程到底什么时候结束,当一个进程完成它的工作终止之后,它的父进程需要调用wait()或waitpid()来取得子进程的终止状态僵尸进程:一个进程创建它的子进程,如果子进程完成它的工作退出(exit()),而父进程并没有调用wait()或waitpid来获取子进程的状态信息,那么子进转载 2017-05-31 08:33:37 · 149 阅读 · 0 评论 -
虚函数的作用
简单的说,被virtual关键字修饰的成员函数就是虚函数我们只需要把基类的成员函数用virtual修饰,其派生类的相应的函数也会自动变为虚函数派生类可以定义基类中的同名函数,派生类的成员将隐藏基类中的同名成员,造成同名覆盖虚函数的作用就是实现多态性,多态性是将接口与实现进行分离指向基类的指针在操作它的多态对象时,会根据不同的类对象,来调用相应的函数,这个函数就是虚函数虚析构函数:将基类的析构函数定转载 2017-06-04 21:46:08 · 679 阅读 · 0 评论 -
大端小端的理解
void right_shift_r(const char* src, char* result, unsigned int n) { const unsigned int LEN = strlen(src); int i = 0;for(i=0; i < LEN; i++){ result[(n + i) % LEN] = src[i];}result[LEN]转载 2017-06-04 23:06:47 · 194 阅读 · 0 评论 -
线程死锁
临界资源:每次只允许一个线程进行访问的资源死锁:线程间相互等待临界资源而造成彼此无法继续执行发生死锁的条件:互斥条件:一个资源每次只能被一个进程使用(临界资源)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺循环等待条件:多个进程因互相等待资源而停止继续执行死锁避免:等待某个资源时,使用超时机制采用消息通转载 2017-06-04 23:29:18 · 478 阅读 · 0 评论 -
smart_ptr
shared_ptr:会记录有多少个shared_ptr共同指向一个对象,一旦某个对象的引用计数变为0,这个对象会被自动删除make_shared:创建管理新对象的共享指针:make_shared需指定类型(’<>’中)及参数(’()’中),传递的参数必须与指定的类型的构造函数匹配template<class T,class... Args>shared_ptr<T> make_shared(Ar原创 2017-11-10 14:40:17 · 798 阅读 · 0 评论