1 定义为数组,声明为指针
如下代码:
test1.c : char a[100]={1,2,3,4}; //assume : &a=0x0000FF00
test1.h: extern char *a;
test2.c: #include "test1.h"
#include <stdio.h>
int main(void)
{
printf("a[0]=%x",a[0]);
return 0;
}
上述代码中,在test2.h中,编译器认为a为指针变量,即char *a; 且指针变量的地址为: &a=0x0000FF00,接下来的四个地址里面的内容被认为是一个地址(小端模式),即把数组内容当做了地址,即:a=0x04030201,明显错误,a[0]即*a取到的数据不知道是哪里的,输出未知,可能死掉。
2 定义为指针,申明为数组
如下代码:
test1.c : char *a=“1234”;//assume : a=0xFFEEDDCC,&a=0x00FF0000
test1.h: extern char a[];
test2.c: #include "test1.h"
#include <stdio.h>
int main(void)
{
char *p=(char*)((a[3]<<24)|(a[2]<<16)|(a[1]<<8)|a[0]);
printf("%x\n",*p);
return 0;
}
上述代码中,test2.h中编译器认为a是一个数组,且a的首地址为:0x0000FF00, 接下来的四个地址内容被认为是数组元素,即把地址当做了数组元素,所以,*p=0x31='1'(小端模式);
总之:编译器按照申明的数据类型进行操作,所以,你的数据类型是数组,那么申明的时候就申明成:char a[]; 如果是指针就申明成 char *a;