同一函数多次定义同名静态变量问题
来源:互联网 发布:inpaint mac破解版 编辑:程序博客网 时间:2024/06/06 10:50
今天在做深圳茁壮网络公司的笔试题时遇到一个令我非常困惑的问题,在网上找了好久没有找到满意的答案,所以只好自己总结下,如果写得有错误,希望大家指出了,毕竟是新手,写得不好勿怪。
为什么可以在同一个函数内定义多次静态同名变量呢?这很违反我之前的认知,以为变量名就想到于我分配的这块地址的入口一样,定义3个同名变量不会搞出大事吗?编译器还不报错,无语.....
我加了很多的printf来测试,发现了一些规律,在这个程序中我总共定义了四个a,哈哈,一个全局变量,3个局部静态变量,通过printf输出可知,3个局部变量都满足就近原则,毕竟计算机也想偷偷懒啊,大家应该都知道,额,还是给大家说明一下吧,以下内容是我复制过来的....讲得还比较简单易懂
(1) 静态局部变量在静态存储区内(data段(初始化)/.bss段(未初始化))分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的
其实这些不是重点,重点是怎么在同一函数中分配3个同名的变量的,md,不怕出事吗?
度娘没有帮助我找到答案,垃圾度娘,只好使出无敌神器GDB来打印4个a的地址,看是不是同一地址,这要是同一地址肯定炸锅了
GDB调试结果:全局变量的地址是 0x804a018(当然每个人的都肯定不一样啦)
函数进口那个a是0x804a020
else里面那一个是0x804a028
if里面那一个是0x804a024
虽然不能说明分配的一定是连续的地址,但是肯定可以说是按定义的先后顺序来分配地址的,而且是在程序运行前就已经分配好了的
以下是源码:
#include<stdio.h>int a=2;int j =1; //只是用来区分第几次运算int f(int n){printf("================%d===============\n",j++);static int a=3;int t=0;if(n%2){printf("1-------a=%-3dt=%-3d\n",a,t);static int a=4;printf("1plus---a=%-3d t=%-3d\n",a,t);t+=a++;printf("2-------a=%-3dt=%-3d\n",a,t);}else{printf("3-------a=%-3dt=%-3d\n",a,t);static int a=5;printf("3plus---a=%-3dt=%-3d\n",a,t);t+=a++;printf("4-------a=%-3dt=%-3d\n",a,t);}printf("5---a=%-3dt=%-3d\n",a,t);return t+a++;}int main(void){int s=a,i;for(i=0;i<3;i++){s+=f(i); printf("s===%d\n",s);printf("\n");}printf("%d\n",s);return 0;}
下面是运行结果:
- 同一函数多次定义同名静态变量问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- js中同名函数和同名变量的执行问题
- Java 中继承之后同名静态变量的问题分析
- C++头文件多次包含 变量,函数重定义解决方案
- c++声明/定义,静态/非静态,变量/函数
- 静态成员变量和静态成员函数的定义
- JavaScript的定义“静态函数”和“静态变量”
- c++声明/定义,静态/非静态,变量/函数
- javascript 同一事件多次绑定问题详解
- 函数的同名变量实现可变函数
- 继承中的同名成员变量和同名成员函数
- C++学习笔记--继承中的同名变量和同名函数
- 多次包含同一个头文件,实现只写一句宏定义就可以定义出两个不同类型的变量
- C++与C#对比学习:函数(三)函数名与变量名同名问题
- 同名函数的调用问题
- Ubuntu PPA源 安装JDK
- JSON解析之手动解析
- vimの分割窗口
- WCF初探(一)
- 大学生与研究生的关系——“砖”与“建筑”
- 同一函数多次定义同名静态变量问题
- 极大似然法详解
- jzoj 2017.9.16 模拟赛
- 2.21 只考加法的面试题后续1
- Integer类==与equals区别与使用
- 如何解决Windows10下安装Ubuntu16.04双系统后没有Ubuntu引导
- 新手必备的12款Asset Store插件
- 暗影精灵3开机黑屏解决方案
- Murmurhash介绍与实现