Search code examples
cdynamicstructureallocation

Defining an array of structures within a structure in C


Hi there I am having a bit of trouble with defining an array of structures within a structure. This is my idea, I need to have a structure called figure which holds the name of the figure, coordinate count and the coordinates (x,y). Each figure can have an arbitrary amount of coordinates. I also need to be able to dynamically reallocate space for an ever increasing list of coords... Please help point me in the right direction. thank you,

tyler

typedef struct {
  char fig_name[FIGURE_LEN + 1];
  int coordcount;
  /* here i need to declare an array of coord structures that 
     but i am not sure how to do this properly. I was originally
     going to try something like as follows */
  coords *pointer;
  pointer = malloc(sizeof(coords));
  pointer = coords figcoord[];
  /* however i am quite certain that this would not work */
} figure;

typedef struct {
  double x;
  double y;
} coords;

Solution

  • Kick toward the right direction. Try something like this. I apologize for the lack of error checking for the malloc() calls, but you will get the general idea (I hope):

    #include <stdlib.h>
    
    #define FIGURE_LEN  128
    
    typedef struct
    {
        double x;
        double y;
    } coords;
    
    typedef struct
    {
        char fig_name[FIGURE_LEN + 1];
        int coordcount;
        coords *pointer;
    } figure;
    
    
    /* allocate a dynamic allocated figure */
    figure* alloc_figure(char* name, int coordcount)
    {
        figure *fig = malloc(sizeof(figure));
        fig->coordcount = coordcount;
        fig->pointer = malloc(sizeof(coords) * coordcount);
        strncpy(fig->fig_name, name, FIGURE_LEN);
        fig->fig_name[FIGURE_LEN] = 0;
        return fig;
    }
    
    /* release a dynamic allocated figure */
    void free_figure(figure** ppfig)
    {
        if (!*ppfig)
            return;
    
        free((*ppfig)->pointer);
        free(*ppfig);
        *ppfig = NULL;
    }
    
    int main(int argc, char *argv[])
    {
        figure fig;
        fig.coordcount = 10;
        fig.pointer = malloc(10 * sizeof(coords));
    
        /* access fid.pointer[0..9] here... */
        fig.pointer[0].x = 1.0;
        fig.pointer[0].y = 1.0;
    
        /* don't  forget to free it when done */
        free(fig.pointer);
    
        /* dynamic allocation function use */
        figure *fig1 = alloc_figure("fig1", 10);
        figure *fig2 = alloc_figure("fig2", 5);
    
        fig1->pointer[9].x = 100.00;
        fig2->pointer[0].y = fig1->pointer[9].x;
    
        /* and use custom free function for releasing them */
        free_figure(&fig1);
        free_figure(&fig2);
    
        return EXIT_SUCCESS;
    }