每日一题gogogo

今天的每日一题来源于真实的企业场景

局部变量能否和全局变量重名?

可以重名,当两者重名的时候,会触发变量遮蔽:在局部变量的作用域内,局部变量拥有更高的优先级,全局变量会被隐蔽,直接使用该变量只会访问局部变量(就近原则)

如何引用一个已经定义过的全局变量?

~同一文件内引用

如果全局变量定义在文件的后半部分,或者为了代码结构清晰,在函数前使用该变量,需要提前通知编译器

方法:使用extern关键字,或者直接在使用前完成变量定义

cs 复制代码
#include <stdio.h>
void print_val(void)
{
    extern int g_val;
    printf("g_val = %d\n",g_val);
}

int g_val = 42;

int main(void)
{
    print_val();
    return 0;
}

~跨文件(多源文件)引用(最常见)

在工程开发过程中,全局变量通常定义在一个源文件(.c)中,.c文件共同访问

在var.c中定义变量(分配内存)

cs 复制代码
int g_shared_count = 100; //定义,分配实际内存

在var.h中用extern声明(不分配内存)

cs 复制代码
#ifndef VAR_H
#define VAR_H

extern int g_shared_count;  //声明,告诉外部存在此符号

#endif

在需要使用的main.c中包含头文件

cs 复制代码
#include <stdio.h>
#include "var.h"

int main(void)
{
    printf("共享变量:%d\n,g_shared_count);
    g_shared_count+=10;
    printf("修改后:%d\n",g_shared_count);
    return 0;
}

全局变量可不可以以定义在可被多个.c文件包含的头文件中?为什么?

计算机底层C语言并不是"先有一个全局总管,再分配给各个文件"

他的流程是分步的

第一步:每个.c都是各做各的,互不通气,假设你的头文件写了 int a = 10;并且file1.c file2.c都包含了

file1.c 编译时,他只看到了自己眼前的文件,看到int a = 10;,申请4个字节的内存,取名叫a,分配的地址是0x1000

file2.c编译时,它也申请4个字节的内存,地址是0x2000

这样,内存里面已经实实在在被造出两个互不相关的独立变量

第二步:链接器来收工时

打包员需要把他们拼成一个app.exe

打开这两个包时,都有这个叫a的变量,但是各自建了一个不同的内存地址,直接报错罢工

如何解决:

只有一个文件负责造实体 其他的文件负责寻人启事(extern)

队列和栈有什么区别:

元素进出的顺序规则与操作端点的限制

核心维度 栈(Stack) 队列(Queue)
操作原则 LIFO(Last In, First Out,后进先出) FIFO(First In, First Out,先进先出)
操作端点 仅单端操作(栈顶 Top 插入与删除) 双端操作(队尾 Rear 入队,队头 Front 出队)
形象比喻 往弹匣装子弹、叠盘子(最后放的最先拿) 排队买票、管道流水(先来的先服务)
常见操作 push(入栈)、pop(出栈)、peek/top(查看栈顶) enqueue(入队)、dequeue(出队)、front(查看队头)
典型应用 函数调用栈、括号匹配、浏览器"后退"、Undo/Redo 任务调度、消息队列、打印机作业缓冲、广度优先搜索(BFS)
算法对应 深度优先搜索(DFS)、回溯算法 广度优先搜索(BFS)
相关推荐
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
2601_962071576 小时前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
估值探索者8 小时前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
打工仔折腾 AI19 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
用户094248568031 天前
第22章:JIT编译分层——Interpreter、C1、C2与热点探测
java·jvm
乌暮1 天前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
长河2 天前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
可乐ea2 天前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
一条破秋裤2 天前
Linux 线程同步:读写锁
java·linux·jvm