2010-07-08 17 views
11

jeśli mamJak przekonwertować z powrotem void * do int

int a= 5; 
long b= 10; 
int count0 = 2; 
void ** args0; 
args0 = (void **)malloc(count0 * sizeof(void *)); 
args0[0] = (void *)&a; 
args0[1] = (void *)&b; 

jak mogę przekonwertować z args [0] i args0 [1] powrót do int i długo? np

int c=(something im missing)args0[0] 
long d=(something im missing)args1[0] 
+3

Uważam, że nie jest dobrą praktyką rzucanie 'void *' na 'int' lub' long'. Szerokość liczb całkowitych i wskaźników niekoniecznie musi być taka sama na danej platformie. Bardziej przenośnym sposobem jest użycie 'intptr_t' lub jeszcze lepszego' uintptr_t'. To gwarantuje, że nie stracisz bitów. –

Odpowiedz

11

Zakładając, że & A0 i & b0 mają być & się i & B i że masz na myśli args0 [1] do utworzenia długiej d, zapisaniu wskaźnik do A args0 [0] i wskaźnik do b w args0 [1]. Oznacza to, że musisz przekonwertować je na odpowiednie typy wskaźników.

int c = *((int *)args0[0]); 
int d = *((long *)args0[1]); 
0

Spróbuj tego:

int c = *((int *) args0[0]); 

long d = *((long *) args0[1]); 
+0

int c = * ((int) args0 [0]); powoduje błąd: nieprawidłowy typ argumentu 'unary *' (ma 'int') i int c = ((int *) args0 [0]); fprintf (stderr, "main():% d \ n", c); powoduje, że wyjście jest -4261808 – w31

+0

Nie rozumiem. Jaka jest różnica między moją odpowiedzią a tą na górze (która jest akceptowana)? – bits

+0

Po pierwszym zaksięgowaniu, "*" zniknęło po "int" z jakiegoś powodu, być może z powodu interpretacji jako formatowanie - patrz komentarz w31, jak wyglądał. –

0

Trzeba powiedzieć to, że nieważne * powinny być interpretowane jako int * lub * Kiedy długo dereference.

int a = 5; 
long b = 10; 
void *args[2]; 
args[0] = &a; 
args[1] = &b; 

int c = *(int*)args[0]; 
long d = *(long*)args[1]; 
2

dosłownie odpowiedzieć na to pytanie, by napisać

int c = *((int *)args0[0]); 
long d = *((long *)args[1]); 

Co może dotyczyć mnie o kod jest, że przydzielone miejsce dla wskaźników do swoich miejsc, ale haven” t przydzielona pamięć dla samych wartości . Jeśli spodziewasz się utrzymywać te lokalizacje poza zakres lokalnej, trzeba zrobić coś takiego:

int *al = malloc(sizeof(int)); 
long *bl = malloc(sizeof(long)); 
*al = a; 
*bl = b; 
void **args0 = malloc(2 * sizeof(void *)); 
args0[0] = al; 
args0[1] = bl; 
0

Podczas gdy inni odpowiedział na to pytanie, zrobię komentarz o ostatnich trzech wierszy w pierwszej części kodu fragment:

args0 = (void **)malloc(count0 * sizeof(void *)); 
args0[0] = (void *)&a; 
args0[1] = (void *)&b; 

powyższe jest lepiej napisany jako:

args0 = malloc(count0 * sizeof *args0); 
args0[0] = &a; 
args0[1] = &b; 

malloc() połączenie jest łatwiejsze do odczytania w ten sposób, i mniej błędów pro ne. Nie potrzebujesz rzutowania w dwóch ostatnich poleceniach, ponieważ C gwarantuje konwersje do i ze wskaźnika obiektu i wskaźnika pustego.

Powiązane problemy