小编Plo*_*uff的帖子

如果全局变量和函数同名会发生什么?

众所周知,函数和变量不能同名。
像这样 :

#include<stdio.h>
int main;
int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是由 'main' 重新声明为不同类型的符号引起的。
但是以下两个文件可以成功编译,让我感到困惑。主文件:

void print_main(void);

int main() {
    print_main();
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

打印_main.c

#include <stdio.h>

char main;

void print_main() {
    printf("Output: 0x%x\n", main);    //Output: ffffffe9
}

Run Code Online (Sandbox Code Playgroud)

困惑

  • 我想知道为什么编译器没有提醒我将“main”重新声明为不同类型的符号?
  • 为什么我得到一个奇怪的数字“ffffffe9”,它是什么?
  • 为什么当我在另一个 IDE 上运行这些文件时奇怪的数字会改变?

我试过的

  • 事实上,我知道这是由全局变量“main”和函数“main()”同名引起的。
    所以,这里发生了一些有趣的事情。
  • 在 Visual Studio 2019 上编译并运行它?输出是“ffffffe9”。
    但是在 CLion 上编译并运行它,输出将是“0x55”
  • 当我尝试检查变量“main”的地址时?我发现它与函数“main()”的地址相同。
    像这样

主文件

void print_main(void);

int main() {
    printf("%p\n", &main);   // 003D12BC 
    print_main();            
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印_main.c

#include <stdio.h>

char main;

void print_main() { …
Run Code Online (Sandbox Code Playgroud)

c linker gcc function global-variables

1
推荐指数
1
解决办法
64
查看次数

标签 统计

c ×1

function ×1

gcc ×1

global-variables ×1

linker ×1