目录
-
野指针
野指针概念:就是指向不可用内存区域的指针。如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃。
易错点:野指针不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是野指针是很危险的,也具有很强的掩蔽性,if语句对它不起作用。
三个常见出现原因:
1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针。在Debug模式下,VC++编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”;会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,使我们能够一眼就能确定我们使用了未初始化的野指针。在Release模式下,编译器则会将指针赋随机值,它会乱指一气。所以,指针变量在创建时应当被初始化,要么将其设置为NULL,要么让它指向合法的内存。
2、指针指向的内存被释放了,而指针本身没有置NULL。对于堆内存操作,我们分配了一些空间(使用malloc函数、calloc函数或new操作符),使用完后释放(使用free函数或delete操作符)。指针指向的内存被释放了,而指针本身没有置NULL。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用。因为即便p不是NULL指针,它也不指向合法的内存块。所以在指针指向的内存被释放后,应该将指针置为NULL。
3 、指针超过了变量的作用范围。即在变量的作用范围之外使用了指向变量地址的指针。这一般发生在将调用函数中的局部变量的地址传出来引起的。这点容易被忽略,虽然代码是很可能可以执行无误,然而却是极其危险的。局部变量的作用范围虽然已经结束,内存已经被释放,然而地址值仍是可用的,不过随时都可能被内存管理分配给其他变量。
-
strcpy的实现,和strncpy的区别
代码实现:
#include "assert.h"
char* strcpy_s(char* a,const char* b) {
assert(a != NULL && b != NULL);
char* address = a;
int i;
for (i = 0; b[i] != '\0'; i++ ) {
a[i] = b[i];
}
a[i] = '\0';
return address;
}
为什么返回char* 类型:为了灵活性,链式表达。
和strcnpy的区别:
两个都是string.h头文件中实现拷贝字符串数组功能的函数。两者的区别从字面上就可以理解,前者正常拷贝整个字符串到另一个字符串数组,后者拷贝前n个字符到另一个字符串数组(很好理解)。
//都是参数后者拷贝给前者
char* strcpy(char* dest, const char* src);
char* strncpy(char* dest, const char* src,int nLen);
-
linux下有哪些信号
信号分为:可靠信号(非实时的),不可靠信号(实时的)。
不可靠信号:SIGINT, SIGILL
可靠信号:SIGSYS ,SIGRTMIN
SIGINT:程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
SIGILL:执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。
-
谈谈IO复用
io复用是io模型的五种模型之一(
- 阻塞式I/O:所有套接字默认
- 非阻塞I/O
- I/O复用(select,poll,epoll)
- 信号驱动式(SIGIO):内核在描述符就绪时发送SIGIO通知进程
- 异步I/O(POSIX的aio_系列函数):
)
select,poll,epoll的用途和原理。