Linux变量问题

自动变量

int autoval;

自动变量就是指在函数内部定义使用的变量

自动变量的潜在问题:

test code:

/*************************************************************************
    > File Name: test_auto.c
    > Author: monkee
    > Created Time: 2015年04月28日 星期二 14时06分29秒
 ************************************************************************/
#include<stdio.h>
int* func()
{
        int *ptr;
        int val;
        val =5;
        ptr = &val;
        return ptr;
}
void func2()
{
        int *ptr;
        int val;
        val =9;
        ptr = &val;
}
int main()
{
        int val=0;
        int *p;
        printf("test auto value\n");
        p = func();
        printf("[1]p value:%d\n",*p);
        printf("[2]p value:%d\n",*p);
        func2();
        //puts("stupid monkee");
        printf("[3]p value:%d\n",*p);
}

test 结果:

说明:当main函数调用func函数时会创建func函数的栈,当func返回时将释放栈,由func函数传回来的指针指向func栈内存,既然执行完func栈被释放,为啥第一次输出是正确的5呢?这是由于栈虽然被回收,但是其值却没有被覆盖掉。接着看第二次输出,输出的结果又不是5了?这说明原func函数栈中的val变量处已被覆盖,我们看到第一次输出时我们调用了printf函数,其也要创建栈也就把func的栈给覆盖了,所以我们输出了一串异常数字。为了更加明确说明问题,我们在构造一个结构与func相同的函数func2,只是将val的值改为9,然后再次输出,我们看见如我们所预测的一样为覆盖的9.

全局变量

static int globval;

全局变量就是指在函数外部定义使用的变量

寄存器变量

register int regival;

在c语言当中可以使用寄存器变量来优化程序的性能,最常见的是在一个函数体当中,将一个常用的变量声明为寄存器变量

静态变量

static int statval;

 静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会不销毁。这就是说静态变量的持续性是程序运行的整个周期。

易失变量

volatile int volaval;

volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的. (2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存.


if while中定义变量的作用域

我们知道,函数、类会改变当前变量的作用域。if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见。

但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP则不然。

在PHP中,if,while等分支循环结构中声明的局部变量,在分支循环结构后面仍然有效。


note:全局变量、静态变量、易失变量不受优化的影响

ref:http://blog.csdn.net/ouyangzhengxuan/article/details/7325505

自动变量潜在的问题http://blog.csdn.net/jnwangcan/article/details/8631143