microcontroller - 在 C 中,静态局部变量和静态全局变量的内存分配
问题描述
在 C 中,具有相同名称声明的静态局部变量和静态全局变量都在同一个文件中完成。它们都存储在数据段内存中。
当我编译代码时为什么它没有抛出错误?
在同一个内存中可以存储2个同名变量吗?
请在下面找到代码
#include <stdio.h>
static int x = 0;
void call()
{
printf("Adress of gloabl static =%p",&x);
}
int main()
{
static int x = 0;
printf("Adress of local static =%p",&x);
call();
}
解决方案
这里有两件事。
变量范围。主要有公众
x
和当地人x
。说x
和main:x
。C 默认为本地的。据我所知,当引用被本地引用覆盖时,C 没有提供访问全局引用的方法。(C++ 可以,::)static
关键字的不同含义。
2.1全局范围内的static
关键字表示该对象x
不能从除此文件之外的任何地方引用。即使使用extern
它也会给你一个错误。这很棒,因为它可以防止在模块中意外使用“私有”对象。
2.2 local 范围内的static
关键字意味着对象x
将被分配一次,永久。任何实例都main()
使用相同的x
.
像全局一样,但只能从范围内访问。x
即使您退出 main,也会持续存在。这也意味着您不能使用初始化程序,如果不是 0,它将在上面出错。从什么时候开始初始化? 标准规定本地范围内的所有静态对象都应被初始化。
如果您需要将数据转移到函数下次运行时(尤其是中断时),但不希望数据公开,则局部静态非常有用。
静态是为多文件微控制器程序进行基本数据隐藏的一个很好的关键字。保持你的代码干净,不要乱扔全局变量。
推荐阅读
- java - 如何在 Spring MVC 中使用 Firebase Admin SDK
- mysql - MySql - RegEx 提取可变数字序列
- mongodb - MongoDB WiredTiger 错误:WiredTiger.turtle:句柄打开:打开:不允许操作
- r - ggplot:带有翻转和对数变换坐标的箱线图
- java - docker-compose + spring boot 几个应用程序不连接
- xamarin.ios - 不是给定文化的有效日历。参数名称:值
- r - 根据值从数据框中删除行,忽略 NA
- ios - 是否可以将谷歌日历添加到 iOS 应用程序?
- oracle-apex - 使用 apex_web_service.make_rest_request 在 oracle apex 中调用 Oracle EBS 标准 Web 服务
- azure-ad-graph-api - O365:TenantUsage_getOffice365ActiveUserDetail 一周未更新?