关于关于extern指针和数组的注意事项

最近开发遇到一个crash的问题,记录下来供参考。

文件1:

char a[4]=”abcd”;

文件2:
extern char *a;

分析:
在文件1中,a是数组地址的别名,代表着”abcd”的起始地址。
在文件2中,a被转化为指针,则”abcd”的起始地址成为指针a的地址,里存放的内容是”abcd”,
显然a指向的空间0x61626364 (abcd的ASCII码值)没有意义,易出现非法内存访问。

文件1:

char *a=”abcd”;

文件2:
extern char a[];

分析:
在文件1中,假设指针a的指针是0x11111111,里面存放的地址是0x22222222,0x22222222这个地址存放的内容是”abcd”.

在文件2中,指针被转化成数组,a是数组地址的别称,那么数组a的地址是0x11111111,数组的内容变成了0x22222222.