• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 关于局部变量重复创建的问题?

关于局部变量重复创建的问题?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了局部变量重复,局部变量,静态局部变量,java局部变量,形式参数是局部变量等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于局部变量重复创建的问题?
描述:

局部变量堆栈内存C语言

先上代码把

void Test(void)
{
while(1)
{
unsigned int i;
i++;
}
}
void main(void)
{
while(1)
Test();
}

局部变量创建是从栈里获取内存的,那么反复创建会不会不停的损耗内存(Test的函数一直没退出),是否就会出现栈溢出呢?
还是编译器会自动优化调。
这个代码风格在任务中(ucos freertos)中很多。求解释下


解决方案1:

void Test(void)
{
    while(1)
    {
        unsigned int i;
        i++;
    }
}
这个只创建了一个变量i,++只是改变了他的值,与耗内存无关。

解决方案2:

首先我在VS2015上运行楼主的程序,结果可能由于开发平台的差异,编译器报错提示使用了未初始化的局部变量" i ",另外个人觉得楼主应该把主程序中的while(1)Test(); 改为 while(1){  Test();}这样好看一点。后来我将程序改写如下:

#include<stdio.h>
void Test(void)
{
while (1)
{
  unsigned int i = 0;
  i++;
  printf("i = %d\n",i);
}
}
void main(void)
{
while (1) 
{
  Test();
}
}

编译并运行发现程序一直输出的都是" i = 1 " ,单步调试时程序一直在子程序Test中的while(1)中反复进行。再反汇编可以看到程序在固定的地址反复执行,如图 关于局部变量重复创建的问题?反复创建不会不停的损耗内存。对汇编语言具体的解释希望大神出来说说 关于局部变量重复创建的问题?我不是很精通。

解决方案3:

引用 7 楼 libin55 的回复:
Quote: 引用 6 楼 g62r83t27 的回复:

在一个地方,重复定义同名变量是违法的,无论怎样都不可以。

编译器没有报错也没有警告~

有些不行,比如KEIL带的编译器
有些可以,比如VS的编译器
开始是不允许,单后后面发现这样写代码不方便,所以有些编译器改进了,可以用的时候定义,并且加入了像for(int I=0;i<100;i++);这样的
在后面定义和在函数开头定义是一样的,只是为了方便

解决方案4:

定义和执行不是一回事

void Test(void)
{
    while(1)
    {
        unsigned int i;
        i++;
    }
}

和
void Test(void)
{
    unsigned int i;
    while(1)
    {
        i++;
    }
}

是等价的,编译器一看你定义了一个uint,于是在堆栈中生成了一个,但你后面的i++仍然还是那个i,并不是一个新的i,它的生命周期是当前函数(某些优化可能导致它用完但函数还没返回就释放了),


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于局部变量重复创建的问题?

相关文章

  • 2017-06-05 在callusbd时出现BreakDuetoPagefault0EHFault=0000是怎么回事???在线等待
  • 2017-06-05 网站访问问题,加了indexphp才能访问到
  • 2017-06-05 URU4000b指纹仪二次开发,谁有经验啊!?
  • 2017-06-05 Workbench30_VxWorks66如何删除干净
  • 2017-06-05 ubuntu中etcresolvcnf中的127011是什么地址
  • 2017-06-05 MDCC2014智能硬件编程马拉松组团讨论帖
  • 2017-06-05 美国赛普拉斯公司(Cypress)EZ-USBFX2LPUSB20基于CY7C68013开发教程
  • 2017-06-05 矢量图形存储
  • 2017-06-05 求助,dm642板子串口通信
  • 2017-06-05 basys2数码管动态显示verilog

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 无线打印服务器的设计?
    • 各位大神留下你们的芳香
    • ALLJOYN支持跨网关通讯么
    • 这样的主板,网卡坏了,怎么换独立网卡?
    • WINCE6,串口打开失败,CreateFile()返回-1
    • 请版主和高手们关注---USB通讯程序中遇到的高难度问题
    • USB驱动编译的问题
    • 各位大侠,请问在QT中如何使lineedit中闪烁的光标水平显示,就像在dos下一样
    • 为什么现在的CPU都没有提寄存器参数
    • 如何利用D触发器或D锁存器构建一个仲裁器

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有