【问题标题】:Strange error while executing a C code in MSVC 2005在 MSVC 2005 中执行 C 代码时出现奇怪的错误
【发布时间】:2009-03-18 12:18:50
【问题描述】:

我正面临以下古怪错误。

我在所有 C 代码的 MSVS2005 中有一个工作区。我已经在一个 C 文件中声明了一个全局变量。(file1.c)该文件具有 main() 函数,在该函数中,我将该变量的值初始化为 0。在其他 C 文件(file2.c)中。从 main 函数调用一个函数(file2.c 中的 func1),该函数将此全局变量的值设置为 1。在 file2.c 中,我将全局变量声明为“extern ..”并访问它。但我注意到的是,在代码执行进入函数 func2 的主函数时刻,我在监视窗口中看到该全局变量本身的地址已更改为完全不同的地址(在监视窗口中,我正在查看 &variable)。结果,当该变量的值设置为 1 时,它会将值 1 写入完全不同的内存地址本身。因此,当稍后我使用此变量检查 if 条件(如果变量 == 1)时,它仍然显示值 0 并且不满足 if 条件并且不采用预期采用的代码路径那条路。

解决方法: 我在现有的全局结构之一中声明了该变量,然后访问该变量以执行相同的操作;代码按预期工作。

那么,如果在某个 C 文件中将全局变量声明为全局变量,导致全局变量地址发生更改的错误的解释是什么?我在哪个 *.c 文件中声明它以及使用“extern”访问哪个文件都没有关系,结果是相同的全局变量地址更改和随后的错误操作。没有启用优化选项。

谢谢,

-AD

【问题讨论】:

  • 肯定有一个小错误。请输入一些代码 sn-ps 好吗?
  • 我认为如果您不尝试描述代码而是直接在此处插入重要部分,您的问题会更容易阅读。

标签: c visual-studio-2005


【解决方案1】:

在没有实际看到代码的情况下只能猜测,但这里有两种可能性:

  1. 全局变量被main()func2()(或者func1() - 问题提到func1() 但我怀疑这是一个错字 - 这就是为什么剪切和粘贴代码相当重要);
  2. 您在file1.c 中错误地将全局变量声明为static,并且在file2.c 中的extern 声明中有一个初始化程序。在 extern 声明上拥有一个初始化器也会导致该声明成为一个定义。

【讨论】:

    【解决方案2】:

    也许尝试将其声明为 volatile(不确定这是否对全局变量有效)并禁用任何编译器优化,以防它变得棘手。

    【讨论】:

      【解决方案3】:

      如果变量在不同的翻译单元中具有不同的地址,那么您看到的不是一个而是至少两个具有相同名称的变量。

      最常见的原因:您可能不小心在堆栈上声明了同名的局部变量。检查您的代码。如果变量确实是全局变量,那么如果两个翻译单元包含相同的符号,链接器就会报错。

      如果这没有帮助,并且如果您仍然看到相同符号名称的多个副本,则最好查看映射文件(可以在链接器设置中启用)。

      那里列出了所有外部符号及其名称、地址以及(在您的情况下最重要的)包含它们的目标文件。

      地图文件中的地址可能只是偏移量。在这种情况下,针对已知仅存在一次的符号进行所有计算。 main() 入口点可能对此有好处。

      【讨论】:

        【解决方案4】:

        可能是您的代码中的拼写错误或类似的东西。试试这个工作演示:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2015-12-21
          相关资源
          最近更新 更多