gpt4 book ai didi

c - 全局变量似乎有两个不同的地址......?

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:44 25 4
gpt4 key购买 nike

考虑以下 4 个文件:

[核心.h]

#pragma once  
static int MY_MARK = -1;

[计数.h]

#pragma once
#include "core.h"
#include <stdarg.h>
#define Count(...) CountImpl(&MY_MARK, __VA_ARGS__, &MY_MARK)
int CountImpl(void*, ...);

[计数.c]

#include "count.h"

int CountImpl(void* dummy, ...) {
int count = 0;
va_list lst;

va_start(lst, dummy);

for(;;) {
void* ptr = va_arg(lst, void *);
if(ptr == &MY_MARK) {break;}
++count;
}

va_end(lst);
return count;
}

[奇怪的问题.c]

#include <tchar.h>
#include "count.h"

int _tmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
int a = 1;
int b = 2;
int c = 3;
int d = Count(&a, &b, &c);
return 0;
}

我正在使用 Microsoft Visual Studio Community 2013。
运行上面的代码时,我希望“d”变量的值为 3。问题是执行永远不会从循环中中断,因为它不会比较“ptr”和“&MY_MARK”是否相等。 (最终它会在尝试读取 protected 内存或其他内容时抛出错误。)
实际上,我在 Watch 窗口中看到了两个不同的地址:

(int*)ptr       0x000000013f8d9004 {WeirdProblemTest.exe!int MY_MARK} {-1}  int *
&MY_MARK 0x000000013f8d9000 {WeirdProblemTest.exe!int MY_MARK} {-1} int *

我知道我可以使用“虚拟”变量而不是引用“&MY_MARK”来解决这个问题,但这不是重点。
我真的需要了解发生了什么,因为同样的问题发生在我的代码的不同部分,而且那里没有很好的解决方法。

很抱歉这篇文章很长,但我没有办法让它更短。

最佳答案

您已将 .h 文件中的变量声明和定义为 static,这意味着 #includes 的每个文件 header 将获得自己的私有(private) 变量副本。

您需要将 core.h 拆分为 core.hcore.c,如下所示:

核心.h:

#pragma once  
extern int MY_MARK;

核心.c:

#include "core.h"

int MY_MARK = -1;

所有其他文件应该#include "core.h",编译和链接时你应该链接到core.c

关于c - 全局变量似乎有两个不同的地址......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28593202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com