求帮分析一个C语言程序

#include<stdio.h>intm=10,n=5,a[10]={1,2,3};voidf1(void){staticintn=3;a[n]=a[n-1]+a[n-... #include <stdio.h>
int m=10,n=5,a[10]={1,2,3};
void f1(void){
static int n=3;
a[n]=a[n-1]+a[n-2]+a[n-3];
n++;
}
void f2(int m){
for(;m<3;m+=2){
int m;
for(m=1;m<4;m++)printf("%d, ",a[m++]);
}
}
void main(void){
int i;
for(i=0;i<7;i++)f1();
f2(1);
for(i=0;i<11;i++)
{
printf("%d; ",a[i]);
}
printf("%d,%d\n %d %d",a[m],a[n]);
}
照理说a[10]是不存在的,为什么最后还是能输出a[m].....还等于10....求助啊,各位大神,小弟已经要疯了
展开
 我来答
jackwind1987
2013-12-23 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:467万
展开全部

这个比较复杂……实际上a[10]就是f1里面的static int n;

先说你的描述:“a[10]是不存在的”,这个说法不对,应该说a[10]是逻辑上不合法的,但实际上,它是一个能用的内存,这个内存和static int n是相同的,所以n最后加到了10,它也就是10了。

为什么两者的内存是同样的,这就要说全局变量和局部静态变量的存储位置了,两者都是存储在静态内存区的,两者只有可见不可见的差别。因为定义完a后,没有别的全局变量了,然后程序一开始就调用了f1,导致statc n的内存分配,于是就分配到了a这个数组的后面,导致了a[10]等价于static n。可以打印它们的地址来证明这一点。

void f1(void){
static int n=3;
printf("static n at %p, global a[10] at %p\n", &n, a+10);
a[n]=a[n-1]+a[n-2]+a[n-3];
n++;
}

可以看到两者的地址是相同的。

sunnyhouyq
2013-12-23 · TA获得超过647个赞
知道小有建树答主
回答量:515
采纳率:100%
帮助的人:512万
展开全部
a[10]是static int n最后的值.
在内存中全局变量m,n,a[10],static int n是连续存放的
你可以试试
int m=10,n=5,a[10]={1,2,3}, t=1000;
a[10]=t=1000
a[11]= (static int n) 10
追问
谢谢您,但是小弟还是有些不懂,在定义了a[10]这个数组之后,不是应该不存在a[10]这个元素的空间么,为什么还可以和static int n的值保持同步呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式