2

我无法理解 c 中的 void* 指针。我已经四处搜索,但还没有真正理解如何解决这个特定问题:

typedef struct _Test{
   char* c;
}Test;


void method(void* test){
    Test t;
    t = *(Test*)test;
    t.c = "omg";
    printf(t.c); //WORKS
}

int main(){
Test t;
method(&t);
printf(t.c); //NOT WORKING,  prints nothing/random letters

return 0;}

为什么?或者更确切地说,解决/解决此问题的最佳方法?

4

4 回答 4

11

在将的对象复制到其中之后,您正在更改t内部的本地对象。这不会改变' 对象中的任何内容,因为您从不向另一个方向复制。method()main()tmain()

您应该只通过指针访问并直接更改调用者的对象:

((Test *) test)->c = "omg";

或者,您可以通过使用正确类型的本地指针使其更清晰,这可能是您想要做的:

void method(void* test) {
    Test *t = test;
    t->c = "omg";
}

请注意,这里不需要强制转换,因为在 C 中void *自动转换为。Test *

于 2012-12-06T12:23:40.343 回答
3

您在方法中定义一个Test对象(在堆栈上创建),然后将给定的指针指向那里。方法返回后,分配的堆栈Test就消失了。

改写:

void method(void* test){
    Test *t;                     // defines a pointer to a Test object
    t = (Test*)test;             // casts the void pointer to a Test pointer
    t->c = "omg";                // assigns data to attribute
    printf(t->c); //WORKS
}

当然,它可以全部放在一行中(不包括printf()),不需要堆栈分配的Test指针:

 void method(void* test){
        ((Test *)test)->c = "omg";
 }
于 2012-12-06T12:24:06.297 回答
1
typedef struct _Test{
   char* c;
}Test;


void method(void* test){
    Test *t;
    t = (Test*)test;
    t->c = "omg";
    printf(t->c); //WORKS
}

int main(){
Test t;
method(&t);
printf(t.c);

return 0;}
于 2012-12-06T12:46:40.173 回答
1

tin method()'s 范围内的阴影tmain()永远不会被触及,因此当您调用printf()它时包含无法确定的数据。

于 2012-12-06T12:26:35.487 回答