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