2024.10.16 遇到了一个 extern Type*
出现崩溃,但 extern Type[]
正常的问题。
声明:本文所有内容都基于 64 位系统和程序而言,32 位原理一致,但数值上会有差异。
现象
通过查阅资料发现 Extern pointer to variable vs array 早就提过这个问题。
// func.c
#include <stdio.h>
int array[10] = { 10, 2, 3 };
int test()
{
printf("in test: array address = %p\n", array);
return 0;
}
// main.c
#include <stdio.h>
extern int* array;
//extern int array[]; // 改为数组就符合预期了
int test();
int main(int argc, char* argv[])
{
printf("in main: array address = %p\n", array);
test();
return 0;
}
将上面两份 c 代码分别保存为 func.c
和 main.c
,在 VS 中运行如下:
通过最终输出,发现 main.c
中 array 把它的内容(9 和 2 拼成长度为 8 的内容)打印出来了。
根因
正如 comp.lang.c FAQ list · Question 6.2 中所述
就此例而言,数组的地址上的内容就是 9
, 而对于指针而言 int *p = array
时,p
的地址本身是不清楚的,只是说 p
的值是 array
的地址。
因此我们在 extern int* arary
的时候 main.c
中 array
编译器认为它是一个指针,而它的地址又跟 func.c
中的 array
一样,因此此时编译器就认为这个指针指向的地址为 array 前几个元素的内容(凑到 8 字节即可)。