今天在做深圳茁壮网络公司的笔试题时遇到一个令我非常困惑的问题,在网上找了好久没有找到满意的答案,所以只好自己总结下,如果写得有错误,希望大家指出了,毕竟是新手,写得不好勿怪。

为什么可以在同一个函数内定义多次静态同名变量呢?这很违反我之前的认知,以为变量名就相当于我分配的这块地址的入口一样,定义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;
}

下面是运行结果:

同一函数多次定义同名静态变量问题相关推荐

  1. 在函数fnl()中定义一个静态变量n,fnl()中对n的值加1,在主函数中,调用fnl()10次,显示n的值,c++

    定义一个静态变量n,fnl()中对n的值加1,在主函数中,调用fnl()10次,显示n的值, (有错误即使指出哈) #include<iostream> using namespace s ...

  2. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  3. java静态变量定义_java静态变量、静态方法和静态代码段

    先上实例 public classTestStatic {public static String staticString = "this is a static String" ...

  4. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel ...

  5. python中静态变量和静态方法_python类和函数中使用静态变量的方法

    本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...

  6. matlab静态变量怎样分配内存,matlab中的静态变量

    persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...

  7. 关于函数调用、静态变量、预编译的习题

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p238-240 习题7 1.程序阅读,写出程序的运行结果 /* (1) */ #include< ...

  8. C#中static静态变量的用法

    原文:C#中static静态变量的用法 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析 ...

  9. 第六章实验报告(函数和宏定义实验)

    C程序设计实验报告 一.实验项目: 1.编写由三角形三边求面积的函数 2.编写求N阶乘的函数 3.求两个整数的最大公约数 4.打印输出三角形 5.求500以内的所有亲密数对 姓名:廖云福 实验地点:教 ...

最新文章

  1. Python爬取4399好wan的小游戏!
  2. 报告分析|2021移动社交行业有哪些新风向?
  3. vs 没有足够的内存继续执行程序_科赋内存条:韩国和台湾产的有不同?
  4. 设计模式学习笔记——组合(Composite)模式
  5. python爬虫练习--爬取猫眼top100电影信息
  6. wireshark-抓包极简使用教程
  7. 我们计划招收300名深度学习者,免费攻读傅里叶变换和MATLAB
  8. mac制作Windows10镜像
  9. java计算机毕业设计户籍管理系统设计源程序+mysql+系统+lw文档+远程调试
  10. 赛宁网安助力中国移动打造国内领先云安全能力
  11. 金额换算(数字换汉字)
  12. ps 画中间透明的边框图形
  13. CSS实现超级炫酷的流光按钮效果
  14. 《大话设计模式》——读后感 (9)牛市股票还会亏钱?——外观模式
  15. VAS开启LaFi空投——助力打造区块链数字黄金新生态
  16. 有效icon设计的三个属性
  17. Android 设置投影效果
  18. 注册控件失败解决办法
  19. Java多线程-新特征-阻塞队列ArrayBlockingQueue
  20. e课表项目第二次冲刺周期第八天

热门文章

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
  2. Java servlet视频教程,完整体系课程-动力节点
  3. JavaScript-DOM-文本节点
  4. 用帆软报表FineReport打造公司数字化经营报表
  5. 结果填空:马的管辖(超详解版)
  6. redis客户端连接,最大连接数查询与设置
  7. matlab里表示颜色,求助:怎么画用颜色表示数值的图
  8. 简述计算机监督分类的基本原理,(揽宇方圆)遥感图像的计算机分类方法包括监督分类和非监督分类...
  9. word(wps)编号
  10. 计算机桌面都有说明书,360桌面助手功能使用说明