![](https://csdnimg.cn/release/download_crawler_static/86208107/bg5.jpg)
29。ISO 的七层模型是什么?
tcp/udp 是属于哪一层?tcp/udp 有何优缺点?
答案:应用层 表示层 会话层 传输层 网络层 链路层 物理层 ;
tcp /udp 属于传输层 ;
TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP
不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等.由于 UDP 比
较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。 tcp: 提供稳定的传输服务,有
流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务,包头小,开销小
30:(void *)ptr 和 (*(void**))ptr 的结果是否相同?其中 ptr 为同一个指针
答案:。(void *)ptr 和 (*(void**))ptr 值是相同的
31:
int main()
{
int x=3;
printf(”%d”,x);
return 1;
}
问函数既然不会被其它函数调用,为什么要返回 1?
答案:mian 中,c 标准认为 0 表示成功,非 0 表示错误。具体的值是某中具体出错信息
32 要对绝对地址 0x100000 赋值,我们可以用 (unsigned int*)0x100000 = 1234; 那么要
是想让程序跳转到绝对地址是 0x100000 去执行,应该怎么做?
答案:*((void (*)( ))0x100000 ) ( ); 首先要将 0x100000 强制转换成函数指针,
即: (void (*)())0x100000 然后再调用它: *((void (*)())0x100000)(); 用 typedef
可以看得更直观些: typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
33,已知一个数组 table,用一个宏定义,求出数据的元素个数
答案: #define NTBL(table) (sizeof(table)/sizeof(table[0]))
34。线程与进程的区别和联系? 线程是否具有相同的堆栈? dll 是否有独立的堆栈?
答案:进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时
候操作系统就帮你创建了一个主线程.每个线程有自己的堆栈。 DLL 中有没有独立的堆栈,
这个问题不好回答,或者说这个问题本身是否有问题.因为 DLL 中的代码是被某些线程所执
行,只有线程拥有堆栈,如果 DLL 中的代码是 EXE 中的线程所调用,那么这个时候是不是
说这个 DLL 没有自己独立的堆栈?如果 DLL 中的代码是由 DLL 自己创建的线程所执行,
那么是不是说 DLL 有独立的堆栈?以上讲的是堆栈,如果对于堆来说,每个 DLL 有自己的堆,
所以如果是从 DLL 中动态分配的内存,最好是从 DLL 中删除,如果你从 DLL 中分配内存,
然后在 EXE 中,或者另外一个 DLL 中删除,很有可能导致程序崩溃
35。