c - 目标文件如何在 C 中链接?解释这种特殊情况

标签 c pointers memory-address

为什么他们打印不同的值。请详细说明。 一个文件是:

    /* boo.c */
#include <stdio.h>
char main;
void p2()
{
printf("0x%X\n", main);
}

另一个文件是:

/* foo6.c */ 
void p2(void);

int main()
{
    char ch = main;
    p2();
    printf("Main address is 0x%x\n",main);
    printf("Char value is 0x%x\n",ch);
    return 0;
}

我希望 p2 和 char ch 打印相同的值,但它们打印的值非常不同。 输出是:

0x55
Main address is 0x401110
Char value is 0x10

我无法得出这些值背后的原因(Main 和 char 值按预期工作,但不是我之前提到的 p2 输出)

最佳答案

char ch = main; 只是截断指向 char 的指针。实现已定义,但您获得低 8 位是有意义的。

现在,另一个编译单元中的 char main(未初始化)通过直接将函数指针内存映射到 char 上来欺骗编译器,而无需任何转换:这就是 未定义的行为

(printf 使用的格式与数据类型不匹配...)

试试看:char main=12; 你会得到一个多重定义的符号 main...

关于c - 目标文件如何在 C 中链接?解释这种特殊情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867089/

相关文章:

c++ - 将 char[][] 转换为 char**

c++ - 如何声明模板类成员类型的指针/引用?

c++ - 静态、堆栈和堆内存分配中的地址排序?

c 打印指针指向的数组的地址

c - 如何从 C 语言文件中将每一行读入整数数组?

c - 如何在应用程序包内的 C 语言中查找当前目录 [macOS]

c - 我询问有关 pcap 库的信息(没有看到任何有关数据的信息。)

c++ - 指向包含两个 vector 的数组的指针

c - 使用指针的正确方法是什么。它们是如何工作的?

c - ## 预处理器运算符的应用和需要考虑的陷阱是什么?