今天写项目程序时遇到一个问题,总结下来就是关于数组类型的外部变量的声明,这里将问题简化如下。
(为了将问题说清楚,后来我又在vs2008下调试了一番,项目中用到的开发环境是CCS4,不过问题的本质是一样的)
example.c
unsigned int Buf[10];
void Init(unsigned int *p)
{
int i;
for(i=0; i<10; i++)
{
*(p + i) = i;
}
}
void main(void)
{
extern unsigned int *Buf;
Init(Buf);
}
该程序编译无错也无警告。
调试时发现Buf却是0x00000000,这个地址当然是不能被处理的。
(项目中用的是DSP处理器,开发环境是CCS4,在“extern unsigned int *Buf;”和“Init(Buf);”处查看Buf时,发现其值确实为数组Buf的首地址,但是当程序执行到Init()函数里面时,形参指针p得到的却是另一个地址,这个地址好像是随机分配的)
百思不得其解,后来将extern声明改为“extern unsigned int Buf[10];”,别的地方不变,则一切都正常了。
对此stone童鞋解释如下:
extern 表示声明一个符号, 这个符号所代表的变量是在其他文件里定义过的。
如果要想用别的文件里定义过的变量,则要用extern声明,且声明的时候应当与定义时的类型保持一致(类型要匹配)。
在example.c中声明的Buf[]是一个数组,Buf是数组名,它是一个常量指针(只读的),而在main.c文件这样“extern unsigned int *Buf”是将其声明为指针变量,这显然是不行的。