我遇到一个问题,指针的位置与我预期的不同(我知道我的语法错误,我只是看不到它,是的,我是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时,它完全指向一个不同的地址。
答案 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");
}
}