C语言面试题

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是个合法的指针。
三、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值