标题: 有个奇怪的想法 哪位高手有思路 请教一下 [打印本页]

作者: dzbj    时间: 2018-11-18 00:01
标题: 有个奇怪的想法 哪位高手有思路 请教一下
c51单片机里我看到和用到的变量分两种 一种是全局变量 一种是函数内部的临时变量 前者任何时候都占用内存 后者只有进入函数才占用 执行完毕即销毁

要请教的是 有什么方法能在使用一个函数时建立变量 运行若干次后 销毁 因为这个函数在起作用的时候可能不止进入一次 临时变量的值在离开函数后保存不了 如果用一个全局变量做转储那就和直接用全局变量没区别了

作者: angmall    时间: 2018-11-18 07:14
你可以用这个

static局部变量
      普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

       static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别:

           1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内)),所以它虽然是局部的,但是在程序的整个生命周期中存在。

           2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

           3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
以下是一些示例程序:

file1.h如下:

#include <stdio.h>
void printStr();


file1.c的内容如下:
#include "file1.h"
void printStr()
{
        int normal = 0;
        static int stat = 0;        //this is a static local var
        printf("normal = %d ---- stat = %d\n",normal, stat);
        normal++;
        stat++;
}

为了便于比较,我定义了两个变量:普通局部变量normal和静态局部变量stat,它们都被赋予初值0;

file2.c中调用file1.h:

#include "file1.h"
int main()
{
printStr();
printStr();
printStr();
printStr();
printf("call stat in main: %d\n",stat);
return 0;
}
复制代码
这个调用会报错,因为file2.c中引用了file1.c中的静态局部变量stat,如下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:9: 错误:‘stat’ 未声明 (在此函数内第一次使用)
file2.c:9: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
file2.c:9: 错误:所在的函数内只报告一次。)

编译器说stat未声明,这是因为它看不到file1.c中的stat,下面注掉这一行:

#include "file1.h"
int main()
{
        printStr();
        printStr();
        printStr();
        printStr();
//        printf("call stat in main: %d\n",stat);
        return 0;
}

liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
normal = 0 ---- stat = 0
normal = 0 ---- stat = 1
normal = 0 ---- stat = 2
normal = 0 ---- stat = 3
运行如上所示。可以看出,函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。


作者: diy1997    时间: 2018-11-18 09:21
我们只是在别人规定的框架里做应用开发设计。


作者: dzbj    时间: 2018-11-18 13:51
angmall 发表于 2018-11-18 07:14
你可以用这个

static局部变量

static这个关键字我用过 但不知道怎么能在不用的时候释放内存 水平还是不够啊 前辈能给个简单的范例么
作者: dzbj    时间: 2018-11-18 13:53
diy1997 发表于 2018-11-18 09:21
我们只是在别人规定的框架里做应用开发设计。

你说的是 但也许有高人可以绕开 就像51的操作系统 有高人看原配的不爽就自己写了一个 虽然碰上这种神人要靠运气 我还是想试试自己的运气
作者: trueman007    时间: 2018-11-18 15:51
静态变量static就是干这个的
作者: 浮念    时间: 2018-11-18 17:34
你可以用这个

static局部变量
      普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

       static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别:

           1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内)),所以它虽然是局部的,但是在程序的整个生命周期中存在。

           2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

           3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
以下是一些示例程序:

file1.h如下:

#include <stdio.h>
void printStr();


file1.c的内容如下:
#include "file1.h"
void printStr()
{
        int normal = 0;
        static int stat = 0;        //this is a static local var
        printf("normal = %d ---- stat = %d\n",normal, stat);
        normal++;
        stat++;
}

为了便于比较,我定义了两个变量:普通局部变量normal和静态局部变量stat,它们都被赋予初值0;

file2.c中调用file1.h:

#include "file1.h"
int main()
{
printStr();
printStr();
printStr();
printStr();
printf("call stat in main: %d\n",stat);
return 0;
}
复制代码
这个调用会报错,因为file2.c中引用了file1.c中的静态局部变量stat,如下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:9: 错误:‘stat’ 未声明 (在此函数内第一次使用)
file2.c:9: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
file2.c:9: 错误:所在的函数内只报告一次。)

编译器说stat未声明,这是因为它看不到file1.c中的stat,下面注掉这一行:

#include "file1.h"
int main()
{
        printStr();
        printStr();
        printStr();
        printStr();
//        printf("call stat in main: %d\n",stat);
        return 0;
}

liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
normal = 0 ---- stat = 0
normal = 0 ---- stat = 1
normal = 0 ---- stat = 2
normal = 0 ---- stat = 3
运行如上所示。可以看出,函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。
作者: dzbj    时间: 2018-11-18 22:09
浮念 发表于 2018-11-18 17:34
你可以用这个

static局部变量

看说明 好像和理想状态不一样

"1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内)),所以它虽然是局部的,但是在程序的整个生命周期中存在。"

它在程序的整个生命周期中存在 我试过这个也是这样 如果声明成静态变量 内存会增加 而且不会被释放 实际上在我的实验里 在函数内部声明static和在开始直接声明在内存数上没什么区别




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1