15.C 源文件 m1.c 和 m2.c 的代码分别如下所示,编译链接生成可执行文件后 执行,结果最可能为 ( ) $ gcc –o a.out m2.c m1.c ; ./a.out 0x1083020 ; ; A. 0x1083018, 0x108301c B. 0x1083028, 0x1083024 C. 0x1083024, 0x1083028 D. 0x108301c, 0x1083018 // m1.c #include <stdio.h> int a1 ; int a2 = 2 ; extern int a4 ; void hello() { printf("%p;", &a1); printf("%p;", &a2); printf("%p\n", &a4); } //m2.c int a4 = 10 ; int main() { extern void hello() ; hello() ; return 0 ; }
时间: 2024-04-23 18:22:43 浏览: 45
答案为 B。
首先,编译链接的命令为 gcc –o a.out m2.c m1.c,由于编译器和链接器的工作顺序是先编译后链接,所以会先编译 m2.c,再编译 m1.c,最后再链接两个目标文件成为可执行文件 a.out。
其次,在 m1.c 中,定义了三个变量 a1、a2 和 extern int a4。其中,a1 是未初始化的全局变量,a2 是初始化为 2 的全局变量,a4 是声明在其他文件中的全局变量,需要在链接时进行解析。
在 hello 函数中,分别输出了三个变量的地址。由于a1未初始化,因此它的地址是 a2 的地址 - 4,因此可能的地址为 0x108301c 或 0x1083024;a2 的地址是 a1 的地址 + 4,因此可能的地址为 0x1083020 或 0x1083028;a4 的地址是在其他文件中定义的,但是由于在 m1.c 中声明了它,因此它的地址应该是在其他文件中分配的,因此可能的地址为 0x1083024 或 0x1083028。
在 main 函数中,调用了 hello 函数,因此会输出这三个变量的地址。最后返回 0,程序正常结束。
综上所述,最可能的输出结果为 0x1083028, 0x1083024。
阅读全文