global.h
typedef enum _global_list {
TEST_VAR1,
TEST_VAR2
} list;
/*Mapper between enum varibales and global variable*/
typedef struct _var_map{
list list_type;
void *ptr;
} var_map;
/*struct to hold global variable*/
typedef struct _glo_ptr{
int *ptr1;
float *ptr2;
} g_ptr;
g_ptr ptr;
void update_global(list ,void *);
global.c
#include "globals.h"
static var_map map[2] = { { TEST_VAR1, &(ptr.ptr1) }, { TEST_VAR2, &ptr.ptr2 } };
update_global(list var, void* ptr){
if (map[0].list_type == TEST_VAR1){
map[0].ptr = ptr;
}
}
testfile.c
#include "globals.h"
int main(){
int test_var1=0;
update_global(TEST_VAR1, &test_var1);
test_var1=4;
printf("%d",*ptr.ptr1); //should contain value 4
}
我要做的是:我的g_ptr
应该包含它指向的最新值。但是在指向指针的过程中,我正在做某些错误导致没有正确更新值。例如:我的最终g_ptr.ptr1
值应包含4.此内需要纠正的内容是什么?
答案 0 :(得分:2)
问题是您正在更改地图中的实际指针,但不会影响指向的数据:
map[0].ptr = ptr;
应该是:
*(int**)map[0].ptr = (int*)ptr;
你的计划背后的动机有点怀疑,但我相信这会给你你想要的......我会保持距离=)
哦,我注意到了另一件事......你宣布了ptr
的单独实例。当您在每个源文件中包含global.h
时,他们会将ptr
视为私有静态变量。那不是你想要的。你需要声明和定义它:
<强> global.h
extern g_ptr ptr;
<强> global.c
g_ptr ptr;