Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C: 2D arrays with structs and pointers

  1. Jan 29, 2012 #1
    I wanted to make a variant on having a player just walking around a small 2d map. Instead of having 2 variables to store the current x and y values of the player position in a certain array, I want to make a 2d array that is filled with NULL pointers. Then the player would be represented as a struct and instead of changing the x and y variables around, I would change the pointers around. I just want to know how you access something like this. Here is my current code:

    Code (Text):
    #include <curses.h>
    #include <stdlib.h>

    #define NUM_ROWS 20
    #define NUM_COLS 20

    #define WALL 0
    #define FLOOR 1
    #define PASS 1
    #define NOT_PASS 0

    typedef struct playerChar {
        int HP;
    } PlayerChar;

    //General struct with pointers to every type of 'creature' that can be shown on map
    typedef struct charPointers {
        PlayerChar * pPointer;
    } CharPointers;

    int main (void) {
        resize_term (NUM_ROWS, NUM_COLS);

        int i, j;
        int ** mapArray = (int **) malloc (NUM_ROWS * sizeof (int *));
        int ** passableArray = (int **) malloc (NUM_ROWS * sizeof (int *));
        int ** charLoc = (int **) malloc (NUM_ROWS * sizeof (int *));

        for (i = 0; i < NUM_ROWS; i++) {
            mapArray [i] = (int *) malloc (NUM_COLS * sizeof (int));
            passableArray [i] = (int *) malloc (NUM_COLS * sizeof (int));
            charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers));
            for (j = 0; j < NUM_COLS; j++) {
                if (i == 0) {
                    mapArray [i][j] = WALL;
                    passableArray [i][j] = NOT_PASS;
                else if (i == (NUM_ROWS - 1)) {
                    mapArray [i][j] = WALL;
                    passableArray [i][j] = NOT_PASS;
                else if (j == 0) {
                    mapArray [i][j] = WALL;
                    passableArray [i][j] = NOT_PASS;
                else if (j == (NUM_COLS - 1)) {
                    mapArray [i][j] = WALL;
                    passableArray [i][j] = NOT_PASS;
                else {
                    mapArray [i][j] = FLOOR;
                    passableArray [i][j] = PASS;
                charLoc[i][j].CharPointers.pPointer = NULL;
    The second struct I have there currently is just to use to hold all of the possible "monster" pointers. Doesn't really do much right now, but that's its intended purpose in the future.

    My question deals with the line: "charLoc[j].CharPointers.pPointer = NULL;". I don't know how I would access something like the struct from a certain position in the array, and then from the struct to the other structs.

    Thanks in advance.
  2. jcsd
  3. Jan 29, 2012 #2
    When referencing a member of a pointer to a struct use the -> operator.
  4. Jan 29, 2012 #3
    But how would i use that in this context? I know that i can do that for when I'm going from pointers to structs, but what would I do for the from an int array to a pointer part?
  5. Jan 29, 2012 #4
    Well for one thing charLoc is an array of pointers to INT and you allocate it with structs make them arrays of pointers to structs
  6. Jan 29, 2012 #5
    So, if I get what you are saying, would I change this:
    Code (Text):
    charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers));
    to this:
    Code (Text):
    charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers *));
    and if the above is correct, do you know what I would need to change to make this:
    Code (Text):
    charLoc[i][j].CharPointers.pPointer = NULL;
  7. Jan 29, 2012 #6
    Drop the type casts from malloc, you dont need it, and more like this
    Code (Text):
    CharPointers ** charLoc =malloc (NUM_ROWS * sizeof (CharPointers*));
    Code (Text):
    charLoc [i] = malloc (NUM_COLS * sizeof (CharPointers));
    Now when you are trying to reference it you are trying to reference a data type instead of the variable name itself example

    Code (Text):
    charLoc[i][j].CharPointers.pPointer = NULL;
    CharPointers is a struct what you want is the variable so drop the Charpointers part and call it like this

    Code (Text):
    charLoc[i][j].pPointer = NULL;
    Last edited: Jan 29, 2012
  8. Jan 29, 2012 #7
    Yes, it's working. Thanks for the help.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook