我有以下代码,我看到两个变量已分配了相同的地址。这两个变量是完全不同的类型。无论如何,我可以使它无效吗?在什么情况下会将相同的内存分配给两个变量。
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],我看到这两个具有相同的内存地址。
答案 0 :(得分:4)
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
不是具有两个或多个元素的数组。毫无限制地访问数组肯定会踩到其他对象。