2010-10-20 12 views
27

Próbuję zrozumieć, co to znaczy, kod patrzę maCo robi "typedef void (* coś)()" oznacza

w .h

typedef void (*MCB)(); 
static MCB  m_process; 

w .C

MCB Modes::m_process = NULL; 

A czasami kiedy robię

m_process(); 

I uzyskać błąd segmentacji, prawdopodobnie dlatego, że pamięć została zwolniona, jak mogę debugować, gdy zostanie uwolniona?

Mam nadzieję, że moje pytania są jasne.

+9

Hey - mówisz C lub C++ ? Twój plik .C wskazuje C++; Twoje tagi wskazują C. Podejmij decyzję - tutaj jest duża różnica między tymi dwoma językami. –

+6

To jest zdecydowanie C++. '.C' jest powszechnym rozszerzeniem pliku C++, a ponadto' Modes :: m_process' byłby nieważny C. – SingleNegationElimination

+0

Autor wyraźnie określił tag, poprosił o C, a on wielokrotnie go edytował do C. Czy on początkowo mylić niektóre kod z innymi, to kolejna dyskusja. Odpowiedź jest właściwa, odpowiadając na fragment C. – another

Odpowiedz

37

Definiuje typ wskaźnika na funkcję. Funkcje zwracają nieważne, a lista argumentów jest nieokreślona, ​​ponieważ pytanie jest (obecnie, ale prawdopodobnie błędnie) oznaczone C; jeśli byłby oznaczony C++, funkcja nie przyjmowałaby żadnych argumentów. Aby uczynić go funkcję, która pobiera żadnych argumentów (w C), można użyć:

typedef void (*MCB)(void); 

Jest to jeden z obszarów, gdzie istnieje znaczna różnica między C, co nie - jeszcze - wymagają, aby wszystkie funkcje do prototypowania, zanim zostanie zdefiniowany lub użyty, oraz C++, który to robi.

+1

Chciałbym zagłosować na kod kompilowany jako C++, ze względu na drugi wiersz w pierwotnym pytaniu za pomocą operatora rozdzielczości zakresu. Mimo to +1 za poprawność techniczną. –

+1

Usunąłem kopalnię, ponieważ jest ona rzeczywiście oznaczona C. Patrzyłem na kod, chociaż tak myślałem w C++. Wasz obejmuje oba, więc dajcie +1. – GManNickG

+1

@GMan: Rozumiem zamieszanie! –

3

Wprowadza typ wskaźnika funkcji, wskazując na funkcję, która nie zwraca niczego (void), nie przyjmuje żadnych parametrów i nazywa nowy typ MCB.

+1

Nie - pobiera nieokreślone parametry (ponieważ pytanie jest oznaczone C), a nie parametry zerowe (tak jak gdyby oznaczono je C++). –

+0

Tak, i nie. Zobacz mój komentarz do odpowiedzi na pytanie, dlaczego uważam, że odpowiadanie w ten konkretny sposób (i prawdopodobnie ponowne oznaczenie pytania) jest w porządku. –

+0

Rozumiem i zgadzam się/sympatyzuję - zredagowałem swoją odpowiedź, aby umożliwić prawdopodobny retagging i wskazać, że tym razem * naprawdę * ma znaczenie, czy pytanie dotyczy C lub C++. –

4

Typedef definiuje MCB jako typ wskaźnika do funkcji, która nie przyjmuje argumentów i zwraca void.

Zauważ, że MCB Modes::m_process = NULL; to C++, nie C. Również w C typedef powinien być naprawdę typedef void (*MCB)(void);.

Nie jestem pewien, co masz na myśli przez "pamięć została uwolniona". Masz statyczny wskaźnik do funkcji; funkcja nie może zostać zwolniona. Co najwyżej wskaźnik został gdzieś skasowany. Po prostu debuguj za pomocą zegarka pamięci na m_process.

3

Wskaźnik funkcji. Otrzymujesz błąd SEGMENTATION, ponieważ próbujesz nawiązać połączenie z funkcją, której adres jest nieprawidłowy (NULL).

W zależności od konkretnej próbki funkcja nie powinna zwracać wartości (void) i nie powinna otrzymywać żadnych parametrów ().

To powinno działać:

void a() 
{ 
    printf("Hello!"); 
} 

int main(int arcg, char** argv) 
{ 
    m_process = a; 
    m_process(); /* indirect call to "a" function, */ 
    // Hello! 
} 

wskaźniki funkcyjne są powszechnie wykorzystywane do jakiejś formy obsługi w C. imprezy To nie tylko jego użycie chociaż ...