extern int[] VS extern int*

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.cmain.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.carray 编译器认为它是一个指针,而它的地址又跟 func.c 中的 array 一样,因此此时编译器就认为这个指针指向的地址为 array 前几个元素的内容(凑到 8 字节即可)。

posted @ 2024-10-16 19:42  cuzperf  阅读(15)  评论(0编辑  收藏  举报