【问题标题】:In C both static local variable and static global variable memory allocation在 C 中,静态局部变量和静态全局变量的内存分配
【发布时间】:2019-05-29 06:07:39
【问题描述】:

在 C 中,静态局部变量和具有相同名称的静态全局变量声明都在同一个文件中完成。它们都存储在数据段内存中。

当我编译代码时为什么它没有抛出错误?

同一内存中可以存储2个同名变量吗?

请在下面找到代码

#include <stdio.h>
static int x = 0;

void call()
{
    printf("Adress of gloabl static =%p",&x);  
}

int main()
{
    static int x = 0;
    printf("Adress of local static =%p",&x);
    call();
}

【问题讨论】:

  • 我投票结束这个问题,因为这是一个纯粹的软件问题,最好在 StackOverflow 上提出(并且可能已经有了答案)。

标签: microcontroller c


【解决方案1】:

这里发生了两件事。

  1. 变量范围。 主要有一个公共x 和一个本地x。说xmain:x。 C 默认为本地的。据我所知,当引用被本地引用覆盖时,C 没有提供访问全局引用的方法。 (C++ 可以,::)

  2. static 关键字的不同含义。
    2.1 全局范围内的static 关键字意味着对象x 不能从除此文件之外的任何地方引用。即使使用extern,它也会给你一个错误。这很棒,因为它可以防止在模块中意外使用“私有”对象。
    2.2本地范围内的static 关键字意味着对象x 将被分配一次永久main() 的任何实例都使用相同的 x
    像全局一样,但只能从范围内访问。 x 即使退出 main 也会持续存在。这也意味着您不能使用初始化程序,如果不是 0,它将在上面出错。从什么时候开始初始化? Standard specifies all static objects in local scope shall be initialized.
    如果您需要将数据转移到下一次函数运行时(尤其是中断时),但不希望数据公开,则本地静态数据非常有用。

静态是为多文件微控制器程序进行基本数据隐藏的一个很好的关键字。保持你的代码干净,不要乱扔全局变量。

【讨论】:

    【解决方案2】:

    这个编程问题已经在 stackoverflow 中得到解答,因为这与电子产品无关。

    也就是说,局部变量具有优先级,并且会影响全局变量。这样做是完全有效的。一些编译器可能会对此提出警告。如果这让您感到困扰,那么请不要使用同名的全局变量和局部变量。

    【讨论】:

    • 应该将此作为答案发布吗?也许对带有链接的问题发表评论更合适。这个问题与电子设计无关,无论如何都应该结束。
    猜你喜欢
    • 2015-10-04
    • 2023-03-29
    • 2015-06-12
    • 2011-01-26
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多