gpt4 book ai didi

c++ - 在 C++ 中将指针变量链接到数组时,链接器实际上做了什么?

转载 作者:行者123 更新时间:2023-12-01 14:24:55 25 4
gpt4 key购买 nike

我已经搜索了很多外部数组指针问题,但仍然感到困惑。

在下面的代码中:

// example 1
//1.cpp
int a[]={1,2,3}; //the array a

//main.cpp
extern int*a; //the pointer a

main.cpp 中,当我使用 printf 打印 a 时,它给我 1 这是1.cpp 中定义的数组 a 的前四个字节。打印 &a 给我 0x1234(例如),它是 1 中定义的数组 a 的第一个元素的地址。 cpp.

它的作用就像指针a 通过地址0x1234 与数组a 强制连接。因此,指针 a 的值位于 0x1234,即 1,因为 sizeof(int*) == 32 位的 sizeof(int)

我了解到链接器需要未解析的符号表和导出符号表来将声明链接到定义。

在编译 1.cpp 时,符号 a 被添加到导出符号表中,而在编译 main.cpp 时,符号 a 被添加到未解析的符号表中。它们的名称应该不同,因为它们的类型不同。

事实上链接器可以检查变量的类型,因为:

//example 2
//1.cpp
int a[]={1,2,3}

//2.cpp
extern char *a;

抛出 char *a 未解析的链接错误,但它们没有强制混合,链接器可以捕获错误。
在单个单元中:

//example 3
int a[] = {1,2,3};
int *ptr = a;

编译器隐式地将 a 变量转换为临时的 int *,但在不同的单元中不能这样做。

那么为什么extern一个接收数组的指针没有被链接器捕获。链接器实际上做了什么?

非常感谢!

最佳答案

C/C++ 部分可以立即处理:对于许多实现,C 不会破坏任何符号,因为它们都应该是唯一的,并且缺少变量重载 C++ 不会也不要破坏它们。 (变量模板被破坏,静态数据成员也是如此。)这不是语言的要求:正式地,您必须对变量使用extern "C",但标准允许与未注释的全局变量发生冲突,这在实践中经常发生(现在是向后兼容性的一个要点)。 C 和 C++ 的其余部分相同。

典型的链接器管理的是每个变量的地址,除了隐含在错位名称中的类型信息外,没有任何类型信息。数组的地址是它的第一个元素的地址,因此您的“指针”最终成为该元素的别名(类型错误)。 (因为正如评论中指出的那样,格式错误,其他欢闹可能会随之而来,例如通过指针存储而不是通过数组可见(通过其他指针访问)。)不同的链接器实现可能更有帮助,但向后兼容性再次禁止它。

关于c++ - 在 C++ 中将指针变量链接到数组时,链接器实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63318473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com