2015-06-10 65 views
2

我正面临一个奇怪的问题。我有一个模块,说x.c这是示例代码段代码:静态全局变量的地址改变了吗?

typedef struct lat {  
    int x; 
    int y; 
    int z; 
} lat; 

static lat x; 

static void populate(int x, int y, int z) { 
    lat *pLat = &x;   
    printf(" The value of pLat is %p \n", pLat); 

    pLat->x = x; 
    pLat->y = y; 
    pLat->z = z; 
} 

extern dump_report(void *pPayload) { 
    lat *pLat = &x;   
    printf(" The value of pLat is %p \n", pLat); 

    memcpy(pPayload, pLat, sizeof(lat)); 
} 

全局变量的地址是不同的(printf S),在这两个功能呢? populate()在模块内部被调用并给出正确的值,而dump_report()被从另一个模块调用并产生全局变量和归零值的错误地址。

有人可以让我知道我是否做错了什么吗?

+3

你是怎么确定由'populate'打印的地址是正确的地址的? (提示:不是。) – hvd

+0

您是使用C或C++编译器 - 您的代码看起来像C,但您也使用C++标记过,我认为这是不合理的。 –

回答

13

你掩盖全局x与当地int x从你的函数定义:

static void populate(int x, int y, int z) 

只需重命名int x

+1

请注意,如果编译器正在发布适当的诊断信息,那么为不兼容类型的指针赋值'&x'将会出错; C和C++都没有这种自动转换。 –

+0

那么,“正确的诊断”允许警告,许多C编译器确实只允许这样的转换,而不是一个错误。尽管如此,OP确实需要检查任何生成的警告。 – hvd

4

局部变量优先于全局变量。所以你必须重命名你的int xstatic lat xenter image description here

而且我会建议你使用更好的编译器。

1

全局静态变量存储在.BSS中,因为它初始化为零。但Local variable存储在堆栈内存中。所以内存地址会有所不同。两个变量都具有相同的名称,但它们存储在不同的存储器中,因为它们在编程上下文中不同。重命名变量将用于您的目的。

0

如果一个全局变量和本地变量名称相同,那么每次都局部变量优先于全局变量。