更新时间2019-01-04 11:08:31
#define NULL 0
main()
{ int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a+5, *q=NULL;
*q=*(p+5);
printf("%d%d ",*p, *q); }
A 5 5
B 6 11
C 运行后报错
D 6 6
求大神的详细过程,答案选C
在c语言中,先定义一个指针,然后赋值,是经常遇到的基本操作。但是为了防止定义的指针成为“野指针”,也就是指针没有初始化,使用*p=NULL是常见的技巧。
本题中,原意是定义指针q,初始化,*q=NULL,然后将p+5(a数组指针向后移动5个元素,也就是从6开始之后的数组)赋值给q,然后输出。
但是,NULL的定义是0(实际上NULL是系统头文件已经定义了的,这里不定义也是NULL=0),这个0是地址为0,也就是0x000000(或者更长),而这个地址实际上是整个物理地址或者系统缓存地址的首地址,这个地址是禁止用户访问和修改的。
以下是问题所在
语句*p=*(p+5)是将p+5地址的元素值,也就是6赋值给q所在地址的位置,这样就引发了系统冲突,运行报错。
也就是说,初始化,将q的指针指向0x000000是可以容忍的,临时停靠嘛,但是还要修改这个地方的数值就是婶婶都不能忍了。
我们的用意是将q指向a+5,而不是将a+5的值赋值给q,尤其是处在敏感地带的q。
合理的语句应该是:q=p+5。也就是将a+5的地址传给q,将q的地址修改为a+5的地址,这样就达成原本目的。
使用vc++,按照题目中的源程序,更改问题语句,进行编译:
#include<stdio.h>
//#define NULL 0
void main()
{
int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a+5;
int *q= NULL ;
q=(p+5);
printf("%d%d ",*p, *q);
}
运行结果正常,参见下图
PS:#define NULL 0这句定义注释掉也是可以通过的。
上一篇:设齐次线性方程组A
下一篇:线性代数求Ax=b的通解