2016-02-26 5 views
0

У меня проблема с указателем, отличающимся от адреса, чем я ожидал (я знаю, что у меня синтаксис неправильный, я просто не вижу его, и да, я новичок в C).C указатель не совпадает с адресом

Я использую библиотеку json под названием jansson, и я написал простую статическую оболочку для преобразования входящей строки в 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 загружается нормально, но когда я вернусь в контексте основной, чтобы затем использовать jsonRoot, он указывает на другой адрес полностью ,

+0

Вы изменяете только локальную переменную внутри 'jsonLoad', поэтому глобальная переменная' root' полностью не изменяется. –

+0

У меня была опечатка, самая первая строка должна была быть 'jsonRoot' не' root' – BarryBones41

+0

Точная же проблема остается, как и непонимание того, как работают аргументы функции C. –

ответ

2

Ваша ошибка заключается в том, что вы помещаете указатель на jsonRoot в локальный корень переменной. Если вы перешли в адрес 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"); 
    } 
} 
+0

Спасибо. Является ли эта плохая практика двойной стрелкой? Является ли это признаком плохого дизайна? – BarryBones41

+2

@ BarryBones41 Это шаблон, который используется во множестве кода C, при возврате данных из функции вам нужно либо использовать возвращаемое значение, либо указатель на выходное местоположение. Часто люди используют возвращаемое значение для кодов ошибок, поэтому фактические данные экспортируются через эти выходные указатели. – Kiskae

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"); 
    } 
} 
Смежные вопросы