2013-08-08 10 views
7

Próbuję dowiedzieć się właściwy sposób zwracać liczbę całkowitą od void * Wywołanie funkcji w obrębie Costrzeżenie: powrót sprawia wskaźnik z liczbą całkowitą bez obsady, ale zwraca liczbę całkowitą jako pożądany

tj ..

#include <stdio.h> 

void *myfunction() { 
int x = 5; 
return x; 
} 

int main() { 
    printf("%d\n", myfunction()); 
    return 0; 
} 

ale wciąż otrzymuję:

ostrzeżenie: powrót sprawia wskaźnik z liczbą całkowitą bez oddanych

Czy muszę wykonać rzutowanie, aby to zadziałało? Wydaje się zwracać x bez problemu, funkcja myfunction zwraca wskaźniki do struktur i ciągów znaków, które działają zgodnie z oczekiwaniami.

+7

Dlaczego to robisz? – orlp

+4

'typem zwrotnym' myfunction' jest 'void *', ale typ 'x' to' int'. Dlaczego chcesz, żeby to działało? Jaka jest prawdziwa funkcja, z którą masz do czynienia? – Mahesh

+0

Wystarczająco dobry powód: zachowanie kodu, który zrobił ktoś inny. –

Odpowiedz

5

Nie jest oczywiste, co próbujesz osiągnąć tutaj, ale zakładam, że próbujesz wykonać arytmetykę wskaźnikową zx, i chciałbyś, żeby x był liczbą całkowitą dla tej arytmetyki, ale nieważny wskaźnik po powrocie . Nie wiedząc, dlaczego tak się dzieje lub nie ma sensu, możesz wyeliminować ostrzeżenie, jawnie rzucając x do pustego wskaźnika.

void *myfunction() { 
int x = 5; 
return (void *)x; 
} 

Najprawdopodobniej spowoduje to kolejne ostrzeżenie, w zależności od tego, jak system implementuje wskaźniki. Może być konieczne użycie długich zamiast int.

void *myfunction() { 
long x = 5; 
return (void *)x; 
} 
+0

To wydaje się, że ostrzeżenie znika, i chciałbym wiedzieć, dlaczego to działa lub jeśli jest to faktycznie niezdefiniowane zachowanie. Każda odpowiedź na to pytanie ma dla mnie sens, ale robi to dokładnie to, co próbowałem zrobić. – user2662982

+0

Pozostałe odpowiedzi zakładają, że chcesz zwrócić wskaźnik do liczby całkowitej, która jest bardzo różna od liczby całkowitej jako wskaźnika. Ostrzeżenie, które otrzymałeś, miało sprawić, że zorientowałeś się, że zamieniłeś int w wskaźnik pustki. Rzucanie wskaźnika na długi jest doskonale zdefiniowane, chociaż często łatwiej jest pracować tylko ze wskaźnikami, aby uniknąć nieporozumień. Ponieważ arytmetyczna miara pustej tablicy jest niedozwolona, ​​należy rozważyć użycie wskaźnika char *, który będzie zachowywał się jako int podczas arytmetyki, ponieważ jego rozmiar to jeden bajt. – user2663103

+1

Warto wspomnieć, że może istnieć platforma, w której "int" jest szersza niż "void *", więc konwersja tego pierwszego na drugi spowoduje utratę bitów. Więc jeśli zapisanie liczby całkowitej w zmiennej wskaźnika jest naprawdę konieczne, można rozważyć zadeklarowanie liczby całkowitej jako 'intptr_t x;' lub 'uintptr_t x;', ponieważ 'intptr_t' i' uintptr_t' są gwarantowane przez standard C w celu dopasowania do wskaźnika zmienna. – alk

1

Pustka * jest wskaźnikiem do czegokolwiek, musisz zwrócić adres.

void * myfunction() { 
    int * x = malloc(sizeof(int)); 
    *x=5; 
    return x; 
} 

W takiej sytuacji nie ma potrzeby, aby powrócić do void * dla int, należy wrócić int * albo jeszcze lepiej po prostu int

+1

Rozumiem twoje zamiary, ale nie ma "nowego" operatora w 'C'. – Mahesh

+0

@Mahesh whoops, nie zwracał uwagi na znaczniki – aaronman

+0

Niezależnie od tego zawsze może zmienić go na 'malloc (sizeof (int))'. – Raptor

0

Chociaż myślę, że najprostszy sposób to zrobić to:

void *myfunction() { 
    int x = 5; 
    return &x; // wrong 
} 

to faktycznie niezdefiniowane zachowanie, ponieważ x jest przydzielona na stosie, a ramka stosu jest „zwinięty” po przywróceniu funkcji. Ta głupia, ale poprawna metoda to:

void *myfunction() { 
    int *x = malloc(sizeof(int)); 
    *x = 5; 
    return x; 
} 

Proszę jednak nigdy nie pisać takich kodów.

+1

Powinieneś znaleźć sposób na umieszczenie całej pierwszej części w jasnoczerwonym kolorze przez x przez nią – aaronman

+0

Jestem zdezorientowany, dlaczego to jest że mogę rzucić liczbę całkowitą jako wskaźnik pustego miejsca podczas wysyłania jej do innej funkcji, ale nie mogę rzucić liczby całkowitej jako wskaźnika pustego, gdy otrzymam ją jako wartość zwracaną? – user2662982

+0

@ user2662982 Liczba całkowita jest przechowywana na stosie. Kiedy wywołujesz funkcję, zachowana jest "ramka stosu" oryginalnej (pamięć dla zmiennych), a nowa funkcja dostaje miejsce "na wierzchu" starej ramki stosu. Jednak po powrocie funkcji nie ma gwarancji, że zmienne zostaną zachowane, ponieważ spacja "na wierzchu" może być użyta dla innych zmiennych. Możesz przeczytać o * stosie * i * stosie *, aby uzyskać więcej szczegółów. –

0

Skompilowałem tego źródła z gcc -pedantic:

#include <stdio.h> 

void *myfunction() { 
    size_t x = 5; 
    return (void*)x; 
} 

int main() { 
    printf("%d\n", *(int*)myfunction()); 
    return 0; 
} 

Nie ma ostrzeżenia

Powiązane problemy