2016-05-13 83 views
-2

我在C.有一個問題,修改參數我有這樣的功能:沒有回報

int test(void *data); 

我想改變數據這個功能,但我不希望另一個原型(不使用無效** )。實際上,數據等於無效此功能。

#include <stdio.h> 
#include <stdlib.h> 

int 
test(void *data) 
{ 
    data = "toto"; 

    return 1; 
} 

int 
main() 
{ 
    void *d; 

    if (test(d) != 1) { 
    printf("erreur\n"); 
    } 

    printf("résultat : %s\n", (char *) d); // displays "résultat : (null)" 

    return 0; 
} 

請幫助我。 ;)

+0

我想知道你爲什麼要避免使用'test(void ** data)'。你的問題的答案是「是的,但這是非常糟糕的做法」,因爲它會相當混亂和容易出錯。 – gdlmx

+1

'void *'可以包含任何對象指針。包括指向另一個指針的指針。所以'void **'是完全不必要的,因爲'void *'可以表示一個'void *',一個'void **',一個'void *****',一個'int ****** *',或任何其他類型的對象指針,你關心存儲在其中。 –

回答

0

在函數的C參數是通過值傳遞的。 d通過值傳遞到功能testdata是一個局部變量功能testd被複制到data。分配

data = "toto"; 

使指針data指向字符串字面toto,而d不受影響這種分配在main功能。所以,這項任務對d沒有影響。

main中,您正在取消引用未初始化的指針。這將導致未定義的行爲。

+0

謝謝。我可以避免使用int test(void ** data)或void * test()嗎? – Vdhsdn

+0

是的。這就是你可以避免這個問題的方法。 – haccks

0

在你測試功能,您可以更改數據,這並不影響d因爲數據僅僅是一個局部變量。如果您確實需要更改d,那麼您需要讓測試返回數據並確定d = test(d)

此外,在您的測試函數中,從未使用數據數據的值。那麼數據作爲函數的參數有什麼意義呢?

In printf(「résultat:%s \ n」,(char *)d);,您試圖將d轉換爲指向char的指針,然後打印值爲d。雖然您不解除引用d,但您仍在打印尚未初始化的變量,這是未定義的行爲。

0

任何對象指針(即非函數指針)都可以轉換爲void *並返回原始類型而不更改該值。這意味着您可以將任何種類的(對象)指針傳遞給您的test()函數,它將自動轉換爲void *,然後您可以將其轉換回test()

#include <stdio.h> 

int test(void *data) 
{ 
    char **s = data; 
    *s = "toto"; 

    return 1; 
} 

int main() 
{ 
    char *res; 

    if (test(&res) != 1) { 
    printf("erreur\n"); 
    } 

    printf("résultat : %s\n", res); 

    return 0; 
} 

您只需確保test()函數知道原始類型是什麼。