回答了问题2017-03-01
阻塞socket会存在一个问题,如果在接收的过程中出现一个client的网络突然中断,或者机器突然崩溃之类的异常,那么这个socket就会阻塞在recv,这样是非常影响性能的。而非阻塞socket就不会影响到其他连接的处理
回答了问题2017-02-19
数组在参数传递中都转换成指针
回答了问题2017-02-18
不要直接返回函数内部声明的数组,函数退出后栈就会回收。要么就像你用的fgets一样,在函数外部定义缓冲区,然后把缓冲区和长度作为函数参数传进去。或者你可以在函数内部malloc一段char的内存,在内部将尾0写好,然后返回这个地址,使用完之后在外部free掉,当然这...
回答了问题2017-02-14
char a[100] = {'0'} 在编译时即可确定内容,而memset要到运行时才会将内容设置为指定值
回答了问题2017-02-14
这就是个双链表,操作的代码你应该没有列完。你自己的数据结构包含这个QUEUE,然后可以使用这些宏定义来操作QUEUE,可以用QUEUE_DATA来还原出你本身要操作的结构,通过偏移量来计算首地址。你可以参考linux内核的list,或者nginx里也有类似的实现
赞了回答2016-09-20
在《effective c++》第三版第27个条款中,Scott Meyers说 有个偏移量(offset)在运行期被施行于Derived*指针身上,用以取得正确的Base*指针值. 实际上一旦使用多继承,这事几乎一直发生着,即使在单一继承中也可能发生。 你可以看下书 这里就是编译器做了一下偏移。因...
回答了问题2016-09-12
把struct理解成class,这就很明显了
关注了问题2016-09-12
回答了问题2016-09-12
大部分的调用约定是从右向左入栈,即最右边的参数最先入栈,比如f(a, b, c),那么最先入栈的就c,其次是b,最后是a。具体到那你这里,首先入栈的是printf("c")的返回值,那么这里就会先对printf("c")进行一个调用。因此这段代码的函数调用顺序最终为printf("c"), prin...
关注了问题2016-09-12
回答了问题2016-09-11
x是int值,一般来说是占用4个字节,在内存布局中,你可以将这个值看成一个长度为4的字节数组。比如x=12345,即0x3039,在内存布局中,x的布局为0x00003039,现在将x的地址强制转换为一个char*指针,再辅以长度,就可以用字节数组来解释这段内存中的数据,可以认为sta...
关注了问题2016-09-11
回答了问题2016-08-18
你把你初始化的每一行一维数组想象成一个元素,再把整个二维数组想象成一个容纳这个元素的一维数组,就明白了。二维数组其实就是一个一维数组的数组,你可以看成是一个嵌套了数个具有相同大小数组的数组。每个数组元素就是一个数组,所以你声明的时候,前一个数字可...
关注了问题2016-08-18
关注了问题2016-08-15
回答了问题2016-08-08
不会,new和delete是处理堆上的内存,堆的管理方式通常会在申请的内存前面加一些关于这块内存的信息,比如长度之类的,所以你new的时候必须指定一个长度,而delete的时候就不需要了,只需要指明是单个还是数组。
关注了问题2016-08-08
回答了问题2016-08-05
估计是你输入完成之后,main函数就直接退出了,你应该在main函数最后返回之前加上一个getc()之类的函数,让程序挂住
关注了问题2016-08-05
回答了问题2016-08-04
1.mmap其实跟物理地址的映射没什么关系,它的作用实际是创建一段虚拟进程空间的地址,将对象映射到这段地址,而使用文件fd的原因是用来指定这个对象,不同进程之间可以通过这个文件来保证映射到进程空间的是同一个对象,达到使用共享内存的目的。所以实际上并不一定...