繁体   English   中英

C中的静态变量

[英]static variables in c

当在文件中声明静态变量时,无法从文件外部对其进行访问。 但是,如果我们在文件和全局指针中声明一个静态变量,然后将该静态变量的地址分配给该指针,然后使该指针外部化,则可以对其进行访问。

正确的说法是不能直接访问静态变量,但可以使用全局指针然后进行外部操作来间接访问静态变量吗?

说静态变量“不能从外部访问”是不正确的。 声明为static绝对与外部访问的可能性无关。

当某个实体被声明为static ,仅表示该实体不会与其他翻译单元中具有相同名称的其他实体相关联。

例如,当您以不同的翻译单位声明两个extern变量名称a时,这些变量实际上是相同的单个变量 当以不同的转换单位声明两个名为a static变量时,这些变量是两个不同的自变量 这就是static在C语言中所做的。

用更多日常用语来讲,不可能从外部链接到静态变量,即不可能要求链接器让我们从外部按名称访问静态变量。 但是,假设您设法以某种方式获得了该指针,则总是可以通过其他方式访问它,例如通过指针。

将静态链接和外部链接的变量名称分别视为“妈妈的房子”和“ 123福街”之类的地址。 前者仅对认识您的人有意义,而后者根据既定惯例对其他人也有意义。 但是,即使“妈妈的房子”没有街道地址,您仍然可以向想要向其发射导弹的人提供经度和纬度。 :-)

C中的static关键字仅将变量的范围限制为特定的翻译单元(即“ C”文件)。换句话说,它仅限制该变量的链接。除此之外,C中的所有static,global和auto变量可以在其生命周期中通过指针进行访问。无法避免这种情况。

如果您有一个指向进程的指针,则可以访问该进程中的任何东西,除非特定于体系结构的机制限制了访问。冗余地说,可以通过指针访问变量是多余的。

无法访问该变量,并且该变量名不会与名称冲突,也没有人可以找到该变量的符号。

但是,当然,您始终可以通过指针访问它。 进程的整个内存(堆栈+堆)可以通过指针进行访问,并且没有任何方法可以防止这种情况发生。

使用静态变量并不是防止从模块外部对其进行访问的安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM