【发布时间】:2017-06-08 06:37:41
【问题描述】:
我的问题是关于内存以及如何在具有多个 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;
}
模块1.c //需要对结构变量进行读/写访问
#include "file1.h"
void module1(void)
{
pLongRangeAccess->var1 = 5;
pLongRangeAccess->var2 = 10;
pLongRangeAccess->var3 = 20;
}
问题 1)请参阅“Version1”关键字中的静态是否使得堆内存中只有一个副本(未初始化),因此只有一个指针变量的地址,或者它会创建 2 个具有不同内存的静态变量,因为每个模块都使用标头?
问题 2) 参见“版本 2” 如果没有为指针变量声明 static,那么它仍然在堆内存中,并且会有一个唯一的地址可用于访问成员的读写操作?
问题 3) 在 file1.h 的版本 2 中,如果指针在 Main.c 中声明,并且内存位置是固定的,即声明为常量,是否可以通过取消引用从任何模块访问它内存地址位置?
【问题讨论】:
-
我看到 3 个问题,这很宽泛。
-
你不在头文件中声明静态变量。而且这些代码中的任何地方都没有堆内存。
-
总的来说,永远不要在头文件中声明任何变量。非常糟糕的程序设计,往往会导致各种链接问题。
-
这些都不在“堆”上。
static表示静态存储持续时间和链接,将其视为编译单元私有的全局变量。您可能正在寻找的是extern -
“因此只有一个指针变量的地址,或者它会创建 2 个具有不同内存的静态变量”,这看起来像 XY problem