c - 结构和静态结构有什么区别?

标签 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,
  },
};

谁能解释一下“静态结构”的必要性是什么,并解释一下它的必要性是什么?

最佳答案

关键字 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 的相同数组声明,则每个编译单元都有自己单独的数组实例。

关于c - 结构和静态结构有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35646330/

相关文章:

c - 使用 SWIG 将指向结构的指针从 TCL 传递到 C 函数

python - Django 静态文件不会加载

c - 我的数据结构错误 [STACK]

c - 正确缓冲和验证字符串

清除char**中的内容

c - 如何显示浮点值的编码

go - 用它的变量制作一个结构的 slice

go - 如何制作运行时指定类型的元素数组

PHP 静态变量

image - Odoo - 如何管理和更新静态文件