静态全局变量的地址已更改?

时间:2015-06-10 05:43:34

标签: c++ c

我面临一个奇怪的问题。我有一个模块,比如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()从不同的模块调用,并产生错误的全局变量地址和零值。

如果我做错了什么,有人可以告诉我吗?

4 个答案:

答案 0 :(得分:13)

您正在使用函数定义中的本地x屏蔽全局int x

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

只需重命名int x

答案 1 :(得分:4)

局部变量优先于全局变量。因此,您必须重命名int xstatic lat x enter image description here

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果全局变量和局部变量具有相同的名称,则每次都会优先考虑局部变量而不是全局变量。