2013-10-07 34 views
2

首先,我知道這應該已經在SO的某個地方回答了,但我似乎無法找到正確的帖子。所以,如果它是重複的,請指出我回復這個問題的帖子,我會刪除它。從函數調用返回後指針爲空

我有一個功能,副本的字符串:

static int read_ad_content(json_t * root, char* content) 
{ 

    [.. stuff happens] 

    const char* tmp = json_string_value(json_content); 
    unsigned int size = strlen(tmp); 
    content = (char*)malloc(size + 1); 
    memcpy(content, tmp, size); 
    content[size] = '\0'; // <= I checked and content is NOT null here! 

    return 0; 
} 

而且我在主函數調用它是這樣的:

char *ad_content; 
if (read_ad_content(ad_json, ad_content) != 0) 
    { 
    log_err(argv, "Failed to extract information"); 
    } 

    if (ad_content == NULL) 
    { 
    // <= I always end up here 
    } 

我知道這應該是容易的,但我就是不知道如何解決這個問題。

+0

您可以修改指針的副本。主叫方的'ad_content'永遠不會被觸碰。 – Mankarse

+0

這不是參考語義的工作方式。例如。 [見這裏](http://stackoverflow.com/a/12449034/596781),或者只是想一下。 –

+0

這是我昨天回答的非常類似的問題。[HERE](http://stackoverflow.com/questions/19214293/unable-to-modify-global-variable-in-c/19214332#19214332) – zubergu

回答

3

在C中,參數按值傳遞。你在做的和以前沒有什麼不同:

void brokenMethod(int a){ 
    a = 10; 
} 

int a = 0; 
brokenMethod(a); 
if(a == 0) 
{ 
    //always end up here! 
} 

當然你總是會在那裏結束。一個從未被修改! a的值被傳遞給了brokenMethod,它可以做任何它想做的事情,但這不會影響你的外部作用域中的值。

如果我想方法來填充一個int,我必須傳遞一個指向int的指針。

void fixedMethod(int* a) 
{ 
    *a = 10; 
    //Remember, you want to modify the thing being pointed at, not the thing doing the pointing! 
    //a = something; is going to have the exact same problem as the first example 
} 

int a = 0; 
fixedMethod(&a); 
if(a == 0) 
{ 
    //Better 
} 

上面的例子將一個值插入一個int。在你的情況下,如果你想讓方法填充一個指向int的指針,那麼你必須將它傳遞給一個指向int的指針。

補充邊欄: 您也可能會發現,通過參數返回值的方法很難推理並且更可能包含錯誤。如果你試圖返回一個指向int的指針,只需要一個方法返回一個指向int的指針。

int* HonestMethod() 
{ 
    return pointer to whatever. 
} 
+1

爲什麼我不'返回指針就是我想要檢查錯誤的方法。當然,有人可能會爭辯說,只要我返回null,一定會發生錯誤。我想我會盡量用你的方式來做。 – Nessuno

+1

對,如果你需要一個函數來設置一個指針*和*指出一個錯誤,那麼除非你爲目的設置了一個結構,這通常很奇怪 - 至少其中的一個必須通過參數修改,因爲C中的函數只能返回一個值。 –

+0

你絕對正確。你有幾個選擇:返回一個包含返回值和某種錯誤指示符的對象,或者返回null作爲錯誤指示。不管你做什麼,確保函數的文檔解釋它。如果你想返回NULL作爲一個錯誤指示器,那麼文檔應該說「如果發生錯誤返回NULL」 –