我面临一个奇怪的问题。我有一个模块,比如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()
从不同的模块调用,并产生错误的全局变量地址和零值。
如果我做错了什么,有人可以告诉我吗?
答案 0 :(得分:13)
您正在使用函数定义中的本地x
屏蔽全局int x
:
static void populate( int x, int y, int z )
只需重命名int x
。
答案 1 :(得分:4)
局部变量优先于全局变量。因此,您必须重命名int x
或static lat x
我建议你使用更好的编译器。
答案 2 :(得分:1)
全局静态变量存储在.BSS中,因为它初始化为零。但是Local variable存储在堆栈内存中。所以内存地址会有所不同。两个变量具有相同的名称,但它们存储在不同的内存中,因为它们在编程上下文中是不同的。重命名变量将满足您的目的。
答案 3 :(得分:0)
如果全局变量和局部变量具有相同的名称,则每次都会优先考虑局部变量而不是全局变量。