0
votes

I'm doing dining-philosopher problem in C for assignment. And got stuck very begining of my code.

I decided each philosopher to be structure, and forks to be int array.

But I can't use global variable in this assignment.

So, I have to include shared variable in philosopher structure to pass them for arguments of thread routine.

Here is my problem - how to include int array in structure if I can't know proper size of them when initializing?

My plan is just include pointer variable in structure then allocate array's address using &.

But It doesn't work :

#include <stdlib.h>

/* inside structure*/
typedef struct s_share {
    int **forks;
} t_share;

/* outside structure */
typedef struct s_philo {
    t_share *share;
} t_philo;


int main(void)
{
    t_philo *philo;
    int     *forks;
    int     i;

    i = 0;

    /* malloc structure arrary philo, size = 10 */
    philo = (t_philo *)malloc(sizeof(t_philo) * 10);

    /* malloc int arrary forks, size = 100 */
    forks = (int *)malloc(sizeof(int) * 100);
    while (i < 10)
    {
        philo[i].share->forks = &forks; //error
        i++;
    }

}

Output : segmentation fault

I tested share->forks size like this :

printf("size of forks : %ld\n", sizeof(philo->share->forks));

Output was 8. It's enough size to store int * pointer. Through this I know It's not the memory allocation problem.

Then what is problem? Can someone check this for me?


Edit : When I try to malloc directly philo->share->forks, I got same error.

typedef struct s_share {
    int *forks;
} t_share;

typedef struct s_philo {
    t_share *share;
} t_philo;


int main(void)
{
    t_philo *philo;
    int     *forks;
    int     i;

    i = 0;
    philo = (t_philo *)malloc(sizeof(t_philo) * 10);
    philo->share->forks = (int *)malloc(sizeof(int) * 100); //error
}

I thought it's because when philo initialized, sizeof operator calculated forks's memroy to be 8 - which required for pointer.

Is there something wrong?


Edit 2 : To clear my question,

It's easy to solve this problem, if I write size of array in structure definition.

typedef struct s_share {
    int forks[100];
} t_share;

typedef struct s_philo {
    t_share *share;
} t_philo;

but according to my assignmet I have to get philosopher's number from cmd. So I can't do that. Above is simple version of my origin code

You have to allocate memory for forks**Shuvo Sarker
This is, in fact, a memory allocation problem!Shuvo Sarker
Why do you even need structs for the philosophers? You can have an array that is the forks and the value represents which philosopher is using the fork?LtWorf
I edited my question after Sarker's comment. It was my first effort but failedacho
I have to use structure because I get sevral arguments form cmd that affect philosophers's state - like eating time. I posted simple version in my question because it's too complicatedacho