NoobCoder
NoobCoder

Reputation: 615

How to run a function using a function pointer that located in a struct? (C)

I want to create an array of structs based on one struct definition, and initialize each one with a different int value.

Then, I want to print this value, using a function pointer that points to a print function.

This is my code:

#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 10

void Print(int num);

typedef struct print_me
{
    int x;
    void (*Print)(int x);
};
    
struct print_me my_prints[ARRAY_SIZE];

int main()
{
    size_t i = 0;
    for (i = 0; i < ARRAY_SIZE; ++i)
    {
        my_prints[i].x = i;
        my_prints[i].Print(my_prints[i].x);
    }
    return 0;
}

void Print(int num)
{
    printf("%d\n",num);
}

I'm still learning the ideas of function pointer and structs , so I'll be glad to get some tips and suggestions that will help me to understand my mistakes here.

Thanks.

Upvotes: 2

Views: 206

Answers (2)

Vlad from Moscow
Vlad from Moscow

Reputation: 311048

For starters there is no any sense to use the typedef specifier in this declaration

typedef struct print_me
{
    int x;
    void (*Print)(int x);
};

without specifying a typedef name. You could write for example

typedef struct print_me
{
    int x;
    void (*Print)(int x);
} print_me;

In the for loop you need to initialize the data member Print with the address of the function Print. For example

for (i = 0; i < ARRAY_SIZE; ++i)
{
    my_prints[i].x = i;
    my_prints[i].Print = Print;
}

then in a second for loop you could call the function like

for (i = 0; i < ARRAY_SIZE; ++i)
{
    my_prints[i].Print( my_prints[i].x );
}

Upvotes: 2

KamilCuk
KamilCuk

Reputation: 141463

As with usual pointers, you have to set a pointer value before you can use it. So that it points somewhere.

Add:

my_prints[i].Print = &Print;
// or, it means the same, & is optional
// my_prints[i].Print = Print;
my_prints[i].Print(my_prints[i].x); // now ok

before calling my_prints[i].Print() so that the pointer will point to function Print before calling it.

Side note with a fun fact: because of the strange C rules, dereferencing the function pointer is not needed, and you can even like "dereference" the function pointer multiple times, like (****my_prints[i].Print)(). See ex this question.

Upvotes: 2

Related Questions