首页 > 教育

#defineNULL0main(){inta[]={1,2,3,4,5,6,7,8

更新时间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); 

}

运行结果正常,参见下图

#define NULL  0 main() {  int a[]={1,2,3,4,5,6,7,8


PS:#define NULL 0这句定义注释掉也是可以通过的。

上一篇:设齐次线性方程组A

下一篇:线性代数求Ax=b的通解