在C语言中,带指针访问的静态变量

时间:2017-06-08 06:37:41

标签: c pointers memory

我的问题是关于内存以及如何在具有多个C文件(多个模块)的程序中访问内存。

file1.h版本1

    #ifndef file1_h
    #define file1_h

    typedef struct
    {
      UINT8  var1;
      UINT16 var2;
      UINT16 var3;
    } TestAccess;

    static TestAccess* pLongRangeAccess;

    #endif

file1.h第2版

    #ifndef file1_h
    #define file1_h

    typedef struct
    {
      UINT8  var1;
      UINT16 var2;
      UINT16 var3;
    } TestAccess_t;

    TestAccess_t* pLongRangeAccess;

    #endif

MAIN.C

#include "file1.h"

void main(void)
{
  pLongRangeAccess->var1 = 4;
  pLongRangeAccess->var2 = 8;
  pLongRangeAccess->var3 = 16;
}

Module1.c //需要对struct变量的读/写访问权限

#include "file1.h"

void module1(void)
{
  pLongRangeAccess->var1 = 5;
  pLongRangeAccess->var2 = 10;
  pLongRangeAccess->var3 = 20;
}

问题1)参见" Version1"关键字中的static是否使得堆内存中只有一个副本(未初始化),因此只有一个指针变量OR的地址,它会创建2个具有不同内存的静态变量,因为每个模块都使用了头文件?

问题2)见"版本2"如果没有为指针变量声明static,那么它仍然在堆内存中,并且会有一个UNIQUE地址可用于访问成员的读写操作吗?

问题3)在file1.h的第2版中,如果指针是在Main.c中声明的,并且内存位置是固定的,即它被声明为常量,它是否可以通过取消引用从任何模块进行访问内存地址位置?

1 个答案:

答案 0 :(得分:5)

我认为你正在将“内存分配”与变量声明和变量定义混合在一起。我想你想要的是在不同的翻译单元之间共享一个变量pLongRangeAccess,这样它在你的程序中只存在一次。为此,在头文件中声明变量,并在单个c文件中定义一次:

#ifndef file1_h
#define file1_h

typedef struct
{
  UINT8  var1;
  UINT16 var2;
  UINT16 var3;
} TestAccess;

extern TestAccess* pLongRangeAccess;

#endif

然后是.c - 文件:

// file1.c:
#include "file1.h"
TestAccess* pLongRangeAccess;

请注意,关键字static在应用于任何函数之外的变量时,意味着此变量对于相应的翻译单元是私有的;这主要是为了隐藏信息和避免与其他翻译单位(可能来自不同供应商)的意外名称冲突。

所以,如果你写

// file1.c
static TestAccess* pLongRangeAccess;

// file2.c
static TestAccess* pLongRangeAccess;

,然后翻译单元file1file2都有自己的私有变量pLingRangeAccess,这对其他翻译单元是不可见的(无论是否有任何头文件将变量声明为{{ 1}})。在这种情况下,链接器不会抱怨任何“重复变量定义”,如上所述 - 变量对其TU是私有的。

但是,如果你写下面的

extern

,然后两个变量对其他翻译单元都可见,并且链接器会抱怨变量// file1.c TestAccess* pLongRangeAccess; // file2.c TestAccess* pLongRangeAccess; 在程序中定义了两次,这是不允许的。