【问题标题】:Why declare a static variable in main?为什么要在 main 中声明一个静态变量?
【发布时间】:2016-11-22 14:16:23
【问题描述】:

阅读别人的代码,我看到了一些语法类似的东西:

int main(void) {
    static int attr[] = {FOO, BAR, BAZ, 0};
    /* ... */
}

这是一个错误还是有一些理由在mainstatic 中声明一个变量?据我了解static 防止链接并保持调用之间的值。因为这里它在一个函数内部,它只执行后者,但main 只被调用一次,所以我不明白这一点。这是否会修改某些编译行为(例如,防止它被优化而不再存在)?

【问题讨论】:

  • IIRC static 变量被放置在不同的部分。另请参阅:stackoverflow.com/questions/93039/…
  • 虽然这可能是不好的做法,但是,正式地,谁阻止您(或其他人)递归调用 main(稍后在代码中)?
  • static 表示变量未分配在栈中(存储在数据段或BSS段中)。
  • 尝试分配没有静态的大数组:int arr[100000000];,看看会发生什么。
  • @user975989:请说明标准中的部分! IIRC 它与 C 完全相反(这并不意味着它是推荐的做法)。 C++ 不允许递归调用main,但那是一种不同的语言。

标签: c static main


【解决方案1】:

除非你在做一些非常不标准的事情,比如直接调用main,否则在main 中声明局部变量static 没有什么意义。

但是,如果您在 main 中使用了一些对于堆栈来说太大的大型结构,那么它很有用。然后,将变量声明为static 意味着它位于数据段中。

static 也意味着,如果未初始化,变量将被初始化为全 0,就像全局变量一样。

【讨论】:

    【解决方案2】:

    static 还告诉编译器将数据存储在通常存储全局变量的内存的 .data 部分中。您可以将其用于可能溢出堆栈的大型数组。

    【讨论】:

    • .bss 仅用于默认初始化数据(仅零)。非零全局变量转到.data
    • @nebuch:你说的是这一段的哪一部分?
    • 它绝对不会用到 BSS,因为它有一个显式的初始化器(除非它全为零)。你最好更正答案,否则它是正确的。
    • @blatinox: ``静态局部常量必须在声明时初始化,但是,因为它们没有单独的声明,因此通常不在 BSS 部分中''
    • @nebuch:我们在这里不讨论常量。同一个链接说:“因此,BSS 段通常包括在文件范围(即,在任何函数之外)声明的所有未初始化对象(变量和常量)以及未初始化的静态局部变量”。
    猜你喜欢
    • 2011-10-21
    • 2010-09-24
    • 1970-01-01
    • 2011-03-23
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多