为什么全局变量没有发生变化?

本文通过一个C语言示例介绍了全局变量与局部变量的区别,作者在使用DFS算法求解最大岛屿问题时,因局部变量遮盖了同名全局变量而导致逻辑错误。

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

今天在nyoj上做一道关于最大岛屿时,我遇到了一个问题,就是在dfs后我的一个全局变量没有发生变化,结果让我调了半天,最后才发现问题。
希望你能从我的错误中找到你想要的答案。
如下代码

#include<stdio.h>
int num;
void dfs(int cur,int num)//注意虽然这里变量也是num但它却是这个函数的局部变量 
{
    if(cur)
        num++;
    return;
}
int main(void)
{
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        num = 0;
        dfs(i,num);
        printf("%d ",num);//s输出的结果就是num没有变化 
    }
}

上面就是我错误的方式,之所以num没变化是因为全局变量和dfs中的局部变量是两个变量,只不过二者的名字定义为一样了,这里我犯了这个白痴的错误。

### C语言单片机Keil全局变量在执行其他操作时的影响 在C语言编写的单片机程序中,特别是在使用Keil环境下开发时,全局变量确实可能受到其他操作的影响。这种现象通常发生在多个地方访问同一个全局变量的情况下。 #### 多线程环境下的影响 当涉及到多任务或多线程环境中运行时,不同任务可能会并发地读取或修改同一全局变量。如果没有适当的同步机制(如互斥锁),这可能导致数据竞争条件,使得全局变量的内容变得不可预测[^2]。 #### 中断服务例程中的干扰 另一个常见问题是中断服务例程(ISR)对全局变量的操作。如果主循环和ISR都试图在同一时刻更改相同的全局标志位或其他共享资源,则可能发生冲突。例如,在某些情况下,一个正在被CPU更新的字节突然被打断去响应外部事件并进入ISR;此时该字节只完成了一部分写入动作就被迫暂停,之后再继续原来的写入流程就可能出现错误的数据状态[^4]。 #### 静态局部变量的情况 对于静态局部变量而言,虽然它们的作用范围限定了仅在其所在函数内部有效,但由于其生命周期贯穿整个应用程序期间,因此也可能遭遇类似的覆盖风险。尤其是在递归调用或者重入函数场景下更为显著[^1]。 为了避免上述问题的发生: - 对于需要跨文件使用全局变量应通过`extern`关键字正确声明; - 使用volatile修饰符告知编译器此变量随时会被改变从而防止优化误判; - 尽量减少不必要的全局变量数量,并考虑利用消息传递等方式代替直接存取公共区域内的数值; - 如果存在潜在的竞争状况,则引入必要的保护措施比如禁用相应时间段内特定类型的中断源或是采用原子性更强的标准API来进行安全交换。 ```cpp // 定义全局变量 int globalVar; void someFunction() { static int localVar; // 静态局部变量 // 关键代码段前关闭中断 __disable_irq(); // 修改全局变量 globalVar++; // 恢复中断使能 __enable_irq(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值