无法从文件外部访问在文件中声明的静态变量。 但是如果我们在文件和全局指针中声明一个静态变量,然后将静态变量的地址分配给指针,然后将指针外部化,则可以访问它。
这是正确的说静态变量不能直接访问但可以使用全局指针间接访问然后外部?
答案 0 :(得分:10)
说静态变量"无法访问"是不正确的。从外面。被宣布为static
与外部访问的可能性完全无关。
当某个实体被声明为static
时,它仅表示该实体不会与其他翻译单元中的同名其他实体相关联。
例如,当您在不同的翻译单元中声明两个extern
变量名称a
时,这些变量实际上是相同的单变量。当您在不同的翻译单元中声明两个名为static
的{{1}}变量时,这些变量是两个不同的独立变量。这就是a
在C中所做的事情。没有别的。
以日常术语来说,不可能将链接到外部的静态变量,即不可能要求链接器让我们按名称访问静态变量 来自外面。但是,总是可以通过其他方式访问它,例如通过指针,假设您设法以某种方式获取该指针。
答案 1 :(得分:6)
将静态和外部链接的变量名称分别视为“maddy's house”和“123 foo street”等地址。前者只对了解你的人有意义,而后者对于其他人也有意义,因为既定的惯例。但即使“疯狂的房子”没有街道地址,它仍然有一个经度和经度,你可以给那些想要发射导弹的人。 :-)
答案 2 :(得分:2)
'C'中的static关键字只是将变量的范围限制为特定的翻译单元(即'C'文件。)。换句话说,它限制了该变量的链接。没有别的。并且在C中静态,全局和自动变量可以通过生命周期中的指针访问。没有办法阻止它。
答案 3 :(得分:1)
如果你有一个指向它的指针,可以访问进程中的任何内容,禁止限制访问的体系结构特定机制。冗下地说可以通过指针访问变量是多余的。
答案 4 :(得分:0)
无法访问该变量,并且没有名称与此变量名称冲突,也没有人能够找到此变量的符号。
但是你当然可以通过指针访问它。可以通过指针访问进程的整个内存(堆栈+堆),并且无法阻止它。
使用静态变量不是防止从模块外部访问它的安全措施。