views:

136

answers:

4

I am trying to understand what this means, the code I am looking at has

in .h

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

in .C

MCB Modes::m_process = NULL;

And sometimes when I do

m_process();

I get segmentations fault, it's probably because the memory was freed, how can I debug when it gets freed?

I hope my questions are clear.

+3  A: 

It introduces a function pointer type, pointing to a function returning nothing (void), not taking any parameters and naming the new type MCB.

Jim Brissom
No - it takes unspecified parameters (because the question is tagged C), not zero parameters (as it would if it were tagged C++).
Jonathan Leffler
Yes, and no. See my comment to your answer as to why I think answering in that specific way (and probably re-tagging the question) is in order.
Jim Brissom
@Jim: I understand and agree/sympathize - I've edited my answer to allow for the probable retagging, and to point out that this time it *really* matters whether the question is about C or C++.
Jonathan Leffler
+7  A: 

It defines a pointer-to-function type. The functions return void, and the argument list is unspecified because the question is (currently, but possibly erroneously) tagged C; if it were tagged C++, then the function would take no arguments at all. To make it a function that takes no arguments (in C), you'd use:

typedef void (*MCB)(void);

This is one of the areas where there is a significant difference between C, which does not - yet - require all functions to be prototyped before being defined or used, and C++, which does.

Jonathan Leffler
I'd vote for the code being compiled as C++, due to the second line in the original question using the scope resolution operator. Still, +1 for being technically correct.
Jim Brissom
I deleted mine, since it is indeed tagged C. I was looking at the code, though so I thought C++. Yours covers both, anyway, so +1 to that.
GMan
@GMan: I understand the confusion!
Jonathan Leffler
+2  A: 

The typedef defines MCB as the type of a pointer to a function that takes no arguments, and returns void.

Note that MCB Modes::m_process = NULL; is C++, not C. Also, in C, the typedef should really be typedef void (*MCB)(void);.

I'm not sure what you mean by "the memory was freed". You have a static pointer to a function; a function cannot be freed. At most, your pointer has been reset somewhere. Just debug with a memory watch on m_process.

Oli Charlesworth
+1  A: 

It's a function pointer. You get a SEGMENTATION FAULT because you are trying to make a call to a function which address is invalid (NULL).

According to your specific sample, the function should return no value (void) and should receive no parameters ().

This should work:

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

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

Function pointers are commonly used for some form of event handling in C. It's not its only use though...

Pablo Santa Cruz