[英]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;}
為什么? 或者更確切地說,解決此問題的最佳方法是什么?
你正在改變本地對象t
內method()
,復制后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";
}
t
在method()
的范圍的陰影t
在main()
的,這永遠不會被觸動,從而無法確定包含數據時調用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.