【问题标题】:Whats the difference between structure and static structure?结构和静态结构有什么区别?
【发布时间】:2016-02-26 07:54:18
【问题描述】:

在查看 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,
  },
};

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

【问题讨论】:

  • 关于静态的含义还有很多关于 SO 的其他示例。至于为什么有必要,您没有显示足够的代码让任何人给您答案。
  • 没有@Joe。我的问题是 struct 和 static struct little edit has been made 有什么区别。 TIA
  • 无论是应用于结构还是其他任何东西,静态都具有相同的行为。至于为什么这个是静态的,我们需要知道它的使用上下文。
  • imx_uart1_resources 是静态的。这是struct resource 的数组。

标签: c struct static


【解决方案1】:

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

【讨论】:

  • 你能解释一下stuct和static stuct的区别吗?
  • 感谢来自莫斯科的@Vlad 的回答
  • @Raj 完全没有。我们初学者应该互相帮助。:)
猜你喜欢
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多