之前写代码,发现了一个没有明确定义元素个数的数组的一个很奇怪的地方。代码如下:
#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int *p=a;
int *q=a+5; /*当5换成别的数时,第17行都会有问题*/
int i;
*q=8;
printf("%d\n",sizeof(a));
printf("p=%p\n",p);
printf("*p=%d\n",*p);
printf("q=%p\n",q);
printf("*q=%d\n",*q); /*运行到此处会出现错误,*q的值不存在了*/
printf("q-p=%d\n",q-p);
for(i=0;i<6;i++){
printf("%d ",a[i]);
}
printf("\n%d\n",sizeof(a));
return 0;
}
其中数组 a 有五个元素,而且sizeof(a)/sizeof(int)也表明 a 中有五个元素。所以代码中的第六行
int *q=a+5;
中所定义的指针 q 其实已经不指向 a 中的任何元素了,但是, 当我们运行它时,输出是这样的:
仍然能输出那个指针 q 所指的值(就是那个8),也就是说 a[5] 是存在的,但是前面的sizeof(a)和最后的sizeof(a)都说明数组 a 中的元素仍是5个(因为sizeof(int)=4),所以说那个指针 q 并没有改变数组 a 中元素的个数与内容,所以我以为,能用 a[5] 来输出 8 是因为数组名本身可以作为指针来用。可是当我把第六行中的5改成比5大的数组后就发生问题了。
#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int *p=a;
int *q=a+6; /*当5换成别的数时,第17行都会有问题*/
int i;
*q=8;
printf("%d\n",sizeof(a));
printf("p=%p\n",p);
printf("*p=%d\n",*p);
printf("q=%p\n",q);
printf("*q=%d\n",*q); /*运行到此处会出现错误,*q的值不存在了*/
printf("q-p=%d\n",q-p);
for(i=0;i<7;i++){
printf("%d ",a[i]);
}
printf("\n%d\n",sizeof(a));
return 0;
}
这时程序就不会运行完,而是这样:
这是什么意思呢,我调试了一下,发现图中第9行运行完变量的值是这样的:
此时的 q=p+6,*q是个随机的值。可是当第11行运行完后,变量变成了这样:
q的地址值变成了 8 ,而q所指向的值*q则没有了。看上面第二幅图中的输出也可发现,
q=0000000000000008 。这就就很奇怪,我上面用来说服自己的数组名可以当指针用的解释好像在这里又行不通了,因为*q=8这句话没有达到我预期的效果,这就是我最大的疑问。就是之前的 q 指向 a+5 时没有问题,那为什么 q 指向 a+6 就有问题了呢?