2016-02-26 75 views
0

我遇到了一個與我預期的地址不同的指針問題(我知道我的語法錯了,我只是看不到它,而且我是新來的C )。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對象獲取加載就好了,但是當我回到主上下文,然後使用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"); 
    } 
}