我可以使用全局指针访问静态变量吗?
//In main.c file
static int c = 20; #Static vairble
int *ptr = &c; #Global pointer variable
int main(){
fun();
printf("%dn", c);
}
//In sub.c file
extern int *ptr;
void fun(){
++*ptr;
}
当我试图在另一个文件中使用extern关键字访问*ptr全局变量时,我可以访问静态变量c,甚至对*ptr所做的更改也反映在主.c文件中的c上
为什么"ptr"即使在由静态变量地址分配后也不会丢失其全局属性?
静态和全局是否存储在两个不同的内存段中,或者它们共享相同的内存数据段?
全局变量可以存储非常数值吗?
static
并不是要将对象放入无法从其他转换单元更改/寻址的内存部分。它只是定义对象具有内部链接,因此不能被其他翻译单元通过这个(内部)名称获取。
但是,如果您以某种方式获得了在另一个转换单元中声明为static
的对象的内存地址,则可以合法地访问该对象。
所以你的构造是有效的。
当其他翻译单元绘制ptr
的副本时(可能在指向c
之前),可能只会遵循"静态初始化顺序惨败"。例如,考虑一下当另一个翻译单元在文件范围内包含时可能发生的情况。。。
extern int *ptr;
int *myPtr = ptr;
...
int main() {
int x = *myPtr;
}
您混淆了指针变量的链接和它指向的链接。
指针的链接不会发生变化,无论它指向什么。
这里ptr
的连锁是全局(又名外部),而c
的连锁是static
(又名内部。任何一方都不会改变另一方的联系。
static
意味着c
在另一个(例如).c
文件中将不可见(即可用于直接链接)。也就是说,另一个.c
可以而不是做:
int *ptr2 = &c;
但是,可以做到:
int **ptr3 = &ptr;
你可以有相反的:
int c = 20;
static int ptr = &c;
这是指向全局/外部链接c
的static
/内部链接ptr
。
一个程序有几个内存区域:.text
用于代码。.data
用于初始化的变量(如c
),.bss
用于单元化区域。
由于初始化了ptr
和c
,它们最终都会出现在.data
中
如果你做过:
#include <stdio.h>
static int c = 20; // Static vairble
int *ptr;
int main(){
ptr = &c;
return 0;
}
然后,c
被初始化并进入.data
,但ptr
没有被初始化,而是被<em]分配>并且进入.bss
段
所有变量[全局或非全局]都可以具有非常数值。通过初始化或赋值。
以上所有变量都具有全局/文件作用域。
这是另一种类型的范围:
#include <stdio.h>
static int c = 20; // Static vairble
int main(){
int *ptr = &c;
return 0;
}
这里,ptr
具有函数作用域。它被放置在main
的堆栈帧上。它没有链接可言(即它永远不会出现在可执行文件的符号表中)。
为什么"ptr"即使在赋值后也不会丢失其全局属性通过静态变量地址?
变量不能"松动"其作用域或存储类,static
链接类说明符确定符号的可见性,而不是存储在何处或如何存储。它防止通过符号引用数据,但不防止指针引用到同一位置。C是一种系统级语言,因此它不会阻止您做任何可以在体系结构级别完成的事情。
静态和全局是否存储在两个不同的内存段中或者它们共享相同的内存数据段?
否。在这种情况下,static
关键字用于指定静态或内部链接,它也用作(函数局部变量)存储类说明符,但函数外部的所有变量都具有静态存储类,无论内部或外部链接如何。
也就是说,初始化的静态存储数据与零或未初始化的数据放在不同的链接器部分。这是为了便于运行时启动初始化。
全局变量可以存储非常数值吗?
也许这需要一个单独的问题来解释你为什么会有不同的想法——它似乎与你的其他问题无关,只是一个左栏。在您自己的示例中,ptr
存储&c
,但可以在运行时对其进行修改以指向其他位置。
为什么"ptr"即使在赋值后也不会丢失其全局属性通过静态变量地址?
ptr保持全局性,无论它指向哪里,因为它被声明为全局的。
静态和全局是否存储在两个不同的内存段中或者它们共享相同的内存数据段?
通常,它们位于同一数据段中。
https://www.geeksforgeeks.org/memory-layout-of-c-program/
全局变量可以存储非常数值吗?
是的,就像任何其他变量一样,因此名称为"变量">