我的问题是关于内存以及如何在具有多个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中声明的,并且内存位置是固定的,即它被声明为常量,它是否可以通过取消引用从任何模块进行访问内存地址位置?
答案 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;
,然后翻译单元file1
和file2
都有自己的私有变量pLingRangeAccess
,这对其他翻译单元是不可见的(无论是否有任何头文件将变量声明为{{ 1}})。在这种情况下,链接器不会抱怨任何“重复变量定义”,如上所述 - 变量对其TU是私有的。
但是,如果你写下面的
extern
,然后两个变量对其他翻译单元都可见,并且链接器会抱怨变量// file1.c
TestAccess* pLongRangeAccess;
// file2.c
TestAccess* pLongRangeAccess;
在程序中定义了两次,这是不允许的。