链接规则引发的全局变量的值被改变

本文详细介绍了C语言中的符号解析规则,包括符号声明与定义的区别,以及这些规则如何影响程序的行为。通过实例展示了当只有变量声明而无定义时,编译器如何处理,并分析了链接规则导致的全局变量值被覆盖的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中符号解析规则如下:

1.不允许有多个符号的定义,这里的符号指的是变量或者函数

2.如果有一个符号定义和多个符号的声明,则选择被定义的符号。

3.如果有多个符号的声明,则从其中任选一个作为符号的定义。

声明和定义有什么区别:

声明表示告知编译器,该变量的存在,此时是为该变量分配存储空间的。

定义,不仅告知编译器该变量存在,而且为该变量赋值。由于需要赋值,所以该变量的存储空间就被分配了。

当该变量的作用域范围内只有声明,而没有该变量的定义时,编译器会自动的将第一个声明认为是变量的定义。

void f(){

   int b;  /*在这里声明变量b,由于在该函数中,没有找到对变量b的定义。

        因此该声明被认为是变量的定义,这时分配了4个字节存储空间给b

         */

   b = 2;   //这里是对变量进行赋值,不是定义。

}


下面这个问题,我总结为链接规则所引发的全局变量值被覆盖的情形:

a.c 函数如下:

//下面是a.c文件中的代码

#include
void f(void);

//全局变量的定义
int a = 123;
int b = 121;

int main(void)
{
    f();
    printf("a = %d,b = %d\n",a,b);
    return 0;
}

//下面是b.c中的代码

double a;
void f()
{ 
    a = 0.0;
}
最后的输出结果会是多少?先来分析一下!

两个源文件中都有对全局变量a的定义和全局变量a的声明,根据如上规则2,所以不会造成链接错误。编译器会选择符号的定义。这是f()函数执行的时候,里面调用的 a 其实是在a.c中定义的全局变量。所不同的是由于b.c中声明的变量类型为双精度型,所以对该变量进行赋值为0.0的时候,需要将由 a 所指的内存空间的首地址开始的8个字节清 0 ,而不是4个字节。因此变量 a 后面的变量b的存储空间就被覆盖掉了。因此,最后输出的结果是:a = 0, b = 0





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国企打工人

随缘吧打赏与否还是会坚持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值