每日一题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)
相关推荐
学到老活到老1 天前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老1 天前
写了 new,就一定会在堆上分配对象吗?
java·jvm
笨笨饿1 天前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机
tedcloud1231 天前
Docker Compose 部署 Memos:从安装到备份恢复
linux·开发语言·jvm·后端·docker·容器·rust
螺蛳粉 螺蛳粉1 天前
大数据第四篇:事故复盘:移走 HBase 里 27 个 hadoop-2.10.2 jar 后,HMaster 半小时后“自杀“了【jar 事故复盘】
jvm·hadoop·hbase·异常处理·大数据运维·踩坑记录·事故复盘
wuminyu1 天前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
学到老活到老2 天前
方法执行完了,对象为什么还占着内存?
java·jvm
骑着蜗牛撵大象3272 天前
四种库收进一个SQL编辑器(下):跨库取数、方言对齐与四库巡检的落地拆解
jvm·数据库·sql·编辑器·数据迁移·跨库查询
需要8263 天前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
Pniubi3 天前
ConcurrentHashMap拆分线程池难点再讲
java·jvm