热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在C语言中,静态变量具有指针访问权限

如何解决《在C语言中,静态变量具有指针访问权限》经验,为你挑选了1个好方法。

我的问题是关于内存以及如何在具有多个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"如果没有为指针变量声明静态,那么它仍然在堆内存中,并且会有一个UNIQUE地址可用于访问成员的读写操作?

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



1> Stephan Lech..:

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

#ifndef file1_h
#define file1_h

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

extern TestAccess* pLongRangeAccess;

#endif

然后是.c-file:

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

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

所以,如果你写

// file1.c
static TestAccess* pLongRangeAccess;

// file2.c
static TestAccess* pLongRangeAccess;

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

但是,如果你写,则如下

// file1.c
TestAccess* pLongRangeAccess;

// file2.c
TestAccess* pLongRangeAccess;

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


推荐阅读
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
可菲儿2702934224
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有