gpt4 book ai didi

c - C语言中,指针访问的静态变量

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:54 24 4
gpt4 key购买 nike

我的问题是关于内存以及如何跨具有多个 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

主要.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” 关键字中的 static 是否使得堆内存中只有一个副本(未初始化),因此指针变量只有一个地址,或者它会创建 2 个具有不同内存的静态变量,因为 header 用于每个模块?

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

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

最佳答案

我认为您混淆了“内存分配”与变量声明和变量定义。我想你想要的是在不同的翻译单元之间共享一个变量 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,当应用于任何函数外部的变量时,意味着该变量对于相应的翻译单元是私有(private)的;这主要是为了信息隐藏和避免与其他翻译单元(可能来自不同供应商)的意外名称冲突。

所以,如果你写

// file1.c
static TestAccess* pLongRangeAccess;

// file2.c
static TestAccess* pLongRangeAccess;

,则翻译单元file1file2都有自己的私有(private)变量pLingRangeAccess,对其他翻译单元不可见(无论是否任何头文件都将变量声明为 extern)。在这种情况下,链接器不会提示任何“重复变量定义”,因为 - 如前所述 - 变量对其 TU 是私有(private)的。

但是,如果您编写以下内容

// file1.c
TestAccess* pLongRangeAccess;

// file2.c
TestAccess* pLongRangeAccess;

,然后两个变量都对其他翻译单元可见,链接器会提示变量 pLongRangeAccess 在您的程序中定义了两次,这是不允许的。

关于c - C语言中,指针访问的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com