EDA365电子论坛网
标题:
野指针
[打印本页]
作者:
baqiao
时间:
2020-9-23 14:50
标题:
野指针
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
4 o0 c9 R* D) L2 X" o/ Q0 C
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
: m7 d1 Q) ~( w& {
; @: i. P" h: n5 y a/ @
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
- t8 `3 v6 }) M) F+ \
# u- y% T2 ~3 ~' f( y
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
3 T' K% f1 w) i; F+ g. G7 t$ r) W
5 l ~: G! U0 s* M# Z3 R
char *p = (char *) malloc(100);
0 ^. l Q6 j. m5 M$ v+ T2 N. n
$ M( A3 @9 Z4 Q5 F: B3 b
strcpy(p, “hello”);
5 B1 [9 O N& e e6 T* p
: L5 E0 K/ R4 ]/ h+ s" x+ ^
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
% @3 P% r. A: D
& }5 |0 {- r$ c$ I7 m7 h% P; c
if(p != NULL) // 没有起到防错作用
2 g! d. W- ^! d+ ~: K
7 V! g6 L% h" ^6 n6 h3 ^% }2 V
strcpy(p, “world”); // 出错
7 w) N1 |( U: W# z
; t0 P( d8 L; G! w" E
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
% _0 Z( h/ d9 g6 i4 g/ R
作者:
ExxNEN
时间:
2020-9-23 15:29
野指针
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2