错题分析_20220929

错题分析_20220929

以下程序有错,错误的原因是 A D

int main()
{ 
	int *p,i;
	char *q,ch;
	p=&i;
	q=&ch;
	*p=40;
	*p=*q;
	printf("i = %d, ch = %c[%d]\n", i, ch, ch);
 	printf("*p = %d, *q = %c[%d]\n", *p, *q, *q);

}

A) p和q的类型不一致,不能执行语句*p=*q;
B) *p中存放的是地址值,因此不能执行语句*p=40;
C) q没有指向具体的存储单元,所以*q没有实际意义
D) q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行语句*p=*q;

运行结果

运行结果

A与D的分析

  • 理论上AD都是错的
    • *p*p分别是int、char类型的指针,强行赋值肯定会存在数据错乱(往小了精度丢失、往大了越界至使错乱)
      1. C信任程序员
        • 美国国家标准协会(ANSI)制定的指导原则中——保持C的精神——列出了以下几点:
          • 信任程序员
          • 不要妨碍程序员做需要做的事
          • 保持语言精练简单
          • 只提供一种方法执行一项操作
      2. 那么语句*p=*q;就属于是程序员有意为之的操作了,事实上也确实很好用
      3. 数据类型不同,占内存也不同,C语言这种不考虑边界的信任,出发点是为了程序更快速的运行
    • ch没有初始化,所以在分配到内存后,无法确定内存内的值,就不可控,结果就是无法确定的。那么为什么是不确定的?
      1. 系统对内存分配、回收,每一任使用者(变量、函数、whatever)的使用释放时不会清空内部的值
      2. 每一任使用者拿到内存时,内部存储的时上一使用者的数据,这数据对于自身就是垃圾数据
      3. 不清空数据也是为了系统更快速的运行
  • *p=*q;是可控的,一定条件下是允许操作的,所以 A没问题
  • ch变量新建未初始化,其值不可控,所以D为错
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值