我正面临着古怪的错误。
我在MSVS2005中有一个所有C代码的工作空间。我在一个C文件中声明了一个全局变量。(file1.c)这个文件有函数main(),其中,我初始化该变量的值= 0.在其他C文件(file2.c)中。从main开始,函数调用函数(file2.c中的func1),它将此全局变量的值设置为1.在file2.c中,我已将全局变量声明为“extern ..”并访问它。但我注意到在主函数时刻代码执行进入函数func2,我在监视窗口看到该全局变量本身的地址被改为一个完全不同的地址(在监视窗口我正在观察和变量)。因此,当该变量的值设置为1时,它将值1写入完全不同的内存地址本身。因此,稍后我使用此变量来检查if条件(如果变量== 1),它仍然显示值0并且不满足if条件并且不采用该代码路径,预期它将在那道路。
解决方法: 我在我的一个现有的全局结构中声明了该变量,然后访问此变量以执行相同的操作;代码按预期工作。
那么如果错误导致全局变量的地址在某个C文件中被声明为全局变量,那么可能是什么原因?无论我在哪个* .c文件中声明它以及使用“extern”访问它的文件,结果都是相同的全局变量地址更改和后续错误操作。没有启用优化选项。
谢谢,
-AD
答案 0 :(得分:1)
只能在没有实际看到代码的情况下猜测,但这里有两种可能性:
main()
或func2()
中的本地隐藏(或者func1()
- 问题提到func1()
但是我怀疑这是一个错字 - 这个这就是为什么剪切和粘贴代码非常重要的原因); static
,并在file2.c中的extern
声明中具有初始值设定项。在extern
声明上使用初始化程序也会导致该声明成为定义。 答案 1 :(得分:0)
也许尝试声明它是volatile(不确定它是否对全局变量有效)并禁用任何编译器优化,以防它以某种方式变得棘手。
答案 2 :(得分:0)
如果变量在不同的翻译单元中具有不同的地址,则您看不到一个但至少有两个具有相同名称的变量。
最常见的原因:您可能意外地在堆栈上声明了一个具有相同名称的局部变量。检查您的代码。如果变量确实是全局变量,则链接器应该抱怨两个转换单元是否包含相同的符号。
如果这没有帮助,并且如果您仍然看到相同符号名称的多个副本,则最好查看映射文件(可以在链接器设置中启用)。
所有外部符号都会在其中列出其名称,地址和(在您的情况下最重要的)包含它们的对象文件。
地图文件中的地址可能只是偏移量。在这种情况下,请执行与已知仅存在一次的符号相关的所有计算。 main()入口点可能对此有利。
答案 3 :(得分:0)
可能是您的代码中的拼写错误或类似内容。试试这个工作演示:
file1.c中
int variable;
void fun1(int k);
int main()
{
printf("%d\n", variable);
fun1(4);
printf("%d\n", variable);
}
file2.c中
extern int variable;
void fun1(int k)
{
variable = k;
}
输出:
0
4
编译:
cl.exe file1.c file2.c