两个静态变量的相同内存位置分配

时间:2019-01-03 21:47:24

标签: c arrays static memory-address

我有以下代码,我看到两个变量已分配了相同的地址。这两个变量是完全不同的类型。无论如何,我可以使它无效吗?在什么情况下会将相同的内存分配给两个变量。

static int Sw_Type [];
static BOOL Sw_Update;

void main()
{
  int i;
  int bytes = 3;
  if (Sw_Update!= TRUE)
  {
    for(i = 0; i< bytes ;i++)
    {
      Sw_Type [i] = *Ver_Value;     
      Ver_Value++;          
    }
    Sw_Update= TRUE;
  }
}

这是我的代码的一部分,“ Ver_Value”是在不同函数中分配的结构。

所以我看到的问题是,当更新Sw_Update时,更新Sw_Type [1],我看到这两个具有相同的内存地址。

2 个答案:

答案 0 :(得分:4)

根据C 2018 6.9.2 2,

static int Sw_Type [];构成了临时定义

  

具有文件范围且没有初始化程序,没有存储类说明符或具有存储类说明符 static 的对象的标识符声明构成临时定义< / em>。如果翻译单元包含一个或多个标识符的临时定义,并且翻译单元不包含该标识符的外部定义,则该行为就好像该翻译单元包含该标识符的文件范围声明,且复合类型为转换单元末尾的值,初始值设定为0。

由于您的程序未提供任何非临时性的定义,因此就好像它以static int Sw_Type [] = { 0 };结尾。 (如果从上面引用的文本中不清楚结果是否确实是一个元素的数组,则可以通过同一子句的第5段中的示例2清楚地表明结果。)

因此,Sw_Type是一个int的数组。它仅包含元素Sw_Type[0]。 C标准未定义访问Sw_Type[1]的行为。根据您报告的观察结果,似乎Sw_Update紧随内存中的Sw_Type,访问Sw_Type[1]会导致修改Sw_Update。这种行为当然是不可靠的。

要增大Sw_Type,必须像static int Sw_Type[4];一样声明其大小。

注:6.9.2 3说:“如果对象的标识符声明是一个临时定义,并且具有内部链接,则声明的类型不应是不完整的类型。”尽管这可以理解为适用于声明的类型。如果每个声明中的type是一个临时定义,我认为一旦翻译单元末尾完全解析了其复合类型,就可以将其应用于对象的声明类型。通过实验,Clang可以先接受一个不完整的类型,然后再完成它。

答案 1 :(得分:2)

  

所以我看到的问题是,当更新Sw_Update时,更新Sw_Type [1],而我看到这两个具有相同的内存地址。

没有Sw_Type [1]。只有具有两个或多个元素的数组才具有第二个条目,而Sw_Type不是具有两个或多个元素的数组。毫无限制地访问数组肯定会踩到其他对象。