簡體   English   中英

c和指針中的void *

[英]void* in c and pointers

我無法理解c中的void *指針。 我已經google了一下,但還沒有真正理解如何解決這個具體問題:

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;}

為什么? 或者更確切地說,解決此問題的最佳方法是什么?

你正在改變本地對象tmethod() ,復制后main()的對象t了進去。 這不會改變main()對象中的任何內容,因為您從不復制到另一個方向。

您應該只通過指針訪問並直接更改調用者的對象:

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

或者,您可以通過使用正確類型的本地指針使其更清晰,這可能是您嘗試執行的操作:

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

請注意,此處不需要void *轉換,因為void *自動轉換為C中的Test *

您正在方法中定義一個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";
 }

tmethod()的范圍的陰影tmain()的,這永遠不會被觸動,從而無法確定包含數據時調用printf()它。

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;}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM