2016-05-13 63 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()函数知道原始类型是什么。