什么是结构和静态结构之间的区别?

时间:2016-02-26 07:54:19

标签: c struct static

当我查看linux设备驱动程序代码时,我发现了以下代码,我无法理解为什么他们提到像静态结构。

static struct resource imx_uart1_resources[] = {
[0] = {
    .start = 0x00206000,
    .end = 0x002060FF,
    .flags = IORESOURCE_MEM,
     },
 [1] = {
.start = (UART1_MINT_RX),
.end = (UART1_MINT_RX),
.flags = IORESOURCE_IRQ,
  },
};

任何人都可以解释什么是“静态结构”的需要并解释它的必要性?

1 个答案:

答案 0 :(得分:2)

关键字static有很多含义,取决于使用关键字的上下文。

如果在函数内声明了结构数组,则表示该数组具有静态存储持续时间而不是自动存储持续时间。

考虑以下示例

#include <stdio.h>

struct A
{
    int x;
};

struct A * f( void )
{
    struct A a = { 10 };

    return &a;
}

int main( void ) 
{
    struct A *pa = f();
    printf( "pa->x = " );
    printf( "%d\n", pa->x );
}

此处函数f定义具有自动存储持续时间的类型为struct A的对象,并返回指向此对象的指针。由于在退出函数后对象不会处于活动状态,因此程序具有未定义的行为。例如,使用内联编译器运行此程序,我得到以下结果

pa->x = 1073981248

另一方面,如果在函数内,对象将具有静态存储持续时间,那么程序将是格式良好的,因为对象在退出函数后将处于活动状态

#include <stdio.h>

struct A
{
    int x;
};

struct A * f( void )
{
    static struct A a = { 10 };

    return &a;
}

int main( void ) 
{
    struct A *pa = f();
    printf( "pa->x = " );
    printf( "%d\n", pa->x );
}

程序输出将按预期进行

pa->x = 10

对象将在函数调用之间保持其值。例如

#include <stdio.h>

struct A
{
    int x;
};

struct A * f( void )
{
    static struct A a = { 10 };

    return &a;
}

int main( void ) 
{
    struct A *pa = f();

    printf( "pa->x = " );
    printf( "%d\n", pa->x );

    pa->x = 20;

    pa = f();

    printf( "pa->x = " );
    printf( "%d\n", pa->x );
}

程序输出

pa->x = 10
pa->x = 20

如果结构的数组在任何函数之外声明,那么它意味着(除了默认的静态存储持续时间)数组名称具有内部链接,它在声明它的编译单元外是不可见的。

如果多个编译单元包含带有关键字static的数组的相同声明,则每个编译单元都有自己独立的数组实例。