3

At the moment I have the following code:

typedef struct _hexagon {
    int *vertice[6];
    int *path[6];
    int resourceType;
} hexagon;


typedef struct _game {
    hexagon hexagons[5][5];
} Game;

and in the main I have:

Game g;
// This is the line that fails
g.hexagons[0][0].vertice[0] = 0;

This compiles fine but gives a segmentation fault. I have tried many variations, such as

g.hexagons[0][0].*vertice[0] = 0;

which doesn't compile. How do I access a pointer's memory from within a struct?

madth3
  • 7,275
  • 12
  • 50
  • 74
Lobe
  • 528
  • 10
  • 25

2 Answers2

5

As vertice is a array-of-pointes-to-integers, to access vertice[0], you need to do *g.hexagons[0][0].vertice[0]

Sample program:

#include <stdio.h>

typedef struct _hexagon {
    int *vertice[6];
    int *path[6];
    int resourceType;
} hexagon;


typedef struct _game {
    hexagon hexagons[5][5];
} Game;

int main()
{
    int i1 = 1;
    int i2 = 2;
    int i3 = 3;
    int i4 = 4;
    int i5 = 5;
    int i6 = 6;

    Game g;
    g.hexagons[0][0].vertice[0] = &i1;
    g.hexagons[0][0].vertice[1] = &i2;
    g.hexagons[0][0].vertice[2] = &i3;
    g.hexagons[0][0].vertice[3] = &i4;
    g.hexagons[0][0].vertice[4] = &i5;
    g.hexagons[0][0].vertice[5] = &i6;

    printf("%d \n", *g.hexagons[0][0].vertice[0]);
    printf("%d \n", *g.hexagons[0][0].vertice[1]);
    printf("%d \n", *g.hexagons[0][0].vertice[2]);
    printf("%d \n", *g.hexagons[0][0].vertice[3]);
    printf("%d \n", *g.hexagons[0][0].vertice[4]);
    printf("%d \n", *g.hexagons[0][0].vertice[5]);

    return 0;   
}

Output:

$ gcc -Wall -ggdb test.c 
$ ./a.out 
1 
2 
3 
4 
5 
6 
$ 

Hope it helps!


UPDATE: as pointed out by Luchian Grigore

The reason for the segmentation fault is explained by the following small program. In short, you are de-referencing a NULL pointer.

#include <stdio.h>

/*
int *ip[3];
+----+----+----+
|    |    |    |
+----+----+----+
   |    |    |
   |    |    +----- points to an int *
   |    +---------- points to an int *
   +--------------- points to an int *

ip[0] = 0;
ip[1] = 0;
ip[2] = 0;

+----+----+----+
|    |    |    |
+----+----+----+
   |    |    |
   |    |    +----- NULL
   |    +---------- NULL
   +--------------- NULL

*ip[0] -> dereferencing a NULL pointer ---> segmantation fault
*/

int main()
{
    int * ip[3];
    ip[0] = 0;
    ip[1] = 0;
    ip[2] = 0;

    if (ip[0] == NULL) {
        printf("ip[0] is NULL \n");
    }

    printf("%d \n", *ip[0]);
    return 0;
}

Now you can co-relate int *ip[] with your g.hexagons[0][0].vertice[0]

Sangeeth Saravanaraj
  • 16,027
  • 21
  • 69
  • 98
0

I think you may have misunderstood what you have declared in _hexagon. *vertice[6] and your other array members are all arrays of pointers, so you have to treat each element like a pointer.

int x = 10;
g.hexagons[0][0].vertice[0] = &x;

Store the address of x into pointer at position 0 of your array of pointers.

Tony The Lion
  • 61,704
  • 67
  • 242
  • 415