|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我自己在看小甲鱼的视频 -> 带你学C带你飞 的系列课程后,发现了一个问题,有点不懂,还希望大家多多帮忙解读
在带你学C带你飞的 P33 生存期和存储类型 这一集中,小甲鱼提到了 static 关键字可以用来修饰局部变量使其变为静态存储器,但它仍然是一个局部变量仍然是代码块作用域,外部无法访问该变量
不过我就自己不信邪,自己瞎整了一下,居然在外部成功访问了这个静态局部变量。
代码如下:
- #include <stdio.h>
- #define aa (*((int *)p)) // 将全局变量p转换为一个整型指针并解引用得到一个可以用于存储的空间
- long int p = 0; // 定义一个全局变量用于接收局部变量的地址值, 使用long int类型是为了避免一些错误
- void func(void);
- void func(void)
- {
- static int a = 0;
- p = (long int)(&a); // 将地址值赋值给全局变量p
- printf("%d\n", a++);
- }
- int main(void)
- {
- int i = 0;
- for(i = 0; i < 10; i++)
- {
- func();
- }
- aa = 2; // 在外部尝试修改静态局部变量的值
- printf("%d\n", aa); // 在外部尝试打印静态局部变量的值
- func(); // 再次尝试调用函数验证局部变量是否被改变
- return 0;
- }
复制代码
编译的时候虽然有很多警告,但是并没有报错,程序可以正常跑起来
- 运行结果:
- PS D:\C语言> gcc .\实验.c
- .\实验.c: In function 'func':
- .\实验.c:9:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
- p = (long int)(&a);
- ^
- .\实验.c: In function 'main':
- .\实验.c:2:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
- #define aa (*((int *)p))
- ^
- .\实验.c:20:5: note: in expansion of macro 'aa'
- aa = 2;
- ^
- .\实验.c:2:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
- #define aa (*((int *)p))
- ^
- .\实验.c:21:20: note: in expansion of macro 'aa'
- printf("%d\n", aa);
- ^
- PS D:\C语言> .\a.exe
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 2
- 2
复制代码
|
|