0

全局.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 *);

全球.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;
    }
}

测试文件.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。这需要更正什么?

4

1 回答 1

2

问题是您正在更改地图中的实际指针,但不影响指向的数据:

map[0].ptr =  ptr;

应该:

*(int**)map[0].ptr =  (int*)ptr;

你的程序背后的动机有点可疑,但我相信这会给你你正在寻找的东西......我会保持距离=)

哦,我注意到另一件事......你声明了ptr. 当您包含global.h在每个源文件中时,它们会ptr被视为私有静态变量。那不是你想要的。您需要像这样声明和定义它:

全局.h

extern g_ptr ptr;

全球.c

g_ptr ptr;
于 2012-10-30T02:48:03.710 回答