1、野指针
int *p;
int a = 10;
*p = a;
printf("%d",*p);
运行结果是什么?
A.10
B.a 的 地址值
C.编译错误
D.运行异常
选项D:运行异常。
解释如下:
在这段代码中,首先声明了一个指向整数的指针 p
,然后定义了一个整数变量 a
并赋值为10。接着,试图通过未初始化的指针 p
来访问内存,即 *p = a;
这行代码。由于 p
没有被初始化,它可能指向任何随机的内存地址,试图写入这个地址将导致未定义行为,这通常会导致程序崩溃或运行时错误。
正确的做法是在使用指针之前先对其进行初始化,例如通过分配内存或将其指向一个已经定义的变量:
int *p;
int a = 10;
p = &a; // 初始化指针p,让它指向变量a的地址
*p = a; // 现在p指向a,所以*p = a是安全的
printf("%d", *p); // 打印a的值,应该是10
在原始代码中,由于 p
没有被初始化,所以不能安全地解引用它,从而导致运行时异常。
其实这个题目考的是野指针。。。
野指针的成因主要有三种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
三、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。