C指针不在同一地址

时间:2016-02-26 19:07:35

标签: c json pointers

我遇到一个问题,指针的位置与我预期的不同(我知道我的语法错误,我只是看不到它,是的,我是C的新手)。

我正在使用名为jansson的json库,我编写了一个简单的静态包装器来将传入的字符串转换为json,但也进行了一些错误检查。

json_t *jsonRoot;
char jsonString[1024];

static bool jsonLoad(char *string, json_t *root){
    json_error_t jsonError;
    root = json_loads(string, 0, &jsonError);
    // Then some error checking is done, and no errors are found
    if(!root)
    {
      return false;
    }
    if(!json_is_object(root)
    {
      return false;
    }
    return true;
}

void main(){
    printf("Incoming string is %s\n", jsonString);
    if(!jsonLoad(jsonString, jsonRoot)
    {
        return 0;
    }

    json_t *id;
    id = json_object_get(jsonRoot, "id");
    if(!json_is_string(id))
    {
        // Getting into here
        printf("Jansson Error: not a string\n");
    }
}

我肯定看到的是,使用断点,我的json对象被加载得很好,但是当我回到main的上下文然后使用jsonRoot时,它完全指向一个不同的地址。

2 个答案:

答案 0 :(得分:2)

您的错误是您将指向jsonRoot的指针放入本地变量root。如果你传入jsonRoot的地址并将结果放入间接,那么你会看到它。请参阅jsonLoad定义的更改以及对它的调用。

json_t *jsonRoot;
char jsonString[1024];

static bool jsonLoad(char *string, json_t **root){
    json_error_t jsonError;
    *root = json_loads(string, 0, &jsonError);
    // Then some error checking is done, and no errors are found
    if(!(*root))
    {
      return false;
    }
    if(!json_is_object(*root))
    {
      return false;
    }
    return true;
}

void main(){
    printf("Incoming string is %s\n", jsonString);
    if(!jsonLoad(jsonString, &jsonRoot)
    {
        return 0;
    }

    json_t *id;
    id = json_object_get(jsonRoot, "id");
    if(!json_is_string(id))
    {
        // Getting into here
        printf("Jansson Error: not a string\n");
    }
}

答案 1 :(得分:0)

我已经接受了sabbahillel的答案,但也重写了这一点,我想要的更多,可能更符合逻辑。

json_t *jsonRoot;
char jsonString[1024];

static bool *jsonLoad(char *string){
    json_error_t jsonError;
    json_t *root;
    root = json_loads(string, 0, &jsonError);
    if(!(root))
    {
      return NULL;
    }
    if(!json_is_object(root))
    {
      return NULL;
    }
    return root;
}

void main(){
    printf("Incoming string is %s\n", jsonString);
    jsonRoot = jsonLoad(jsonString);
    if(jsonRoot == NULL)
    {
        return 0;
    }

    json_t *id;
    id = json_object_get(jsonRoot, "id");
    if(!json_is_string(id))
    {
        printf("Jansson Error: not a string\n");
    }
}