佚名通过本文主要向大家介绍了局部变量重复,局部变量,静态局部变量,java局部变量,形式参数是局部变量等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于局部变量重复创建的问题?
描述:
局部变量创建是从栈里获取内存的,那么反复创建会不会不停的损耗内存(Test的函数一直没退出),是否就会出现栈溢出呢?
还是编译器会自动优化调。
这个代码风格在任务中(ucos freertos)中很多。求解释下
解决方案1:
编译并运行发现程序一直输出的都是" i = 1 " ,单步调试时程序一直在子程序Test中的while(1)中反复进行。再反汇编可以看到程序在固定的地址反复执行,如图
反复创建不会不停的损耗内存。对汇编语言具体的解释希望大神出来说说
我不是很精通。
解决方案3:
有些不行,比如KEIL带的编译器
有些可以,比如VS的编译器
开始是不允许,单后后面发现这样写代码不方便,所以有些编译器改进了,可以用的时候定义,并且加入了像for(int I=0;i<100;i++);这样的
在后面定义和在函数开头定义是一样的,只是为了方便 解决方案4:
和
是等价的,编译器一看你定义了一个uint,于是在堆栈中生成了一个,但你后面的i++仍然还是那个i,并不是一个新的i,它的生命周期是当前函数(某些优化可能导致它用完但函数还没返回就释放了),
描述:
局部变量堆栈内存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,++只是改变了他的值,与耗内存无关。
首先我在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)中反复进行。再反汇编可以看到程序在固定的地址反复执行,如图


有些不行,比如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,它的生命周期是当前函数(某些优化可能导致它用完但函数还没返回就释放了),