handles
handles

Reputation: 7853

Create a struct with more than 1 dynamically sized array in c?

Is it possible to create a struct containing two dynamically size arrays in c?

I have something like this:

#define MAX_DATA 512

    struct Address {
    int id;
    int set;
    char name[MAX_DATA];
    char email[MAX_DATA];
};

I'd like MAX_DATA to be defined at run time.

I have seen the struct hack:

How to include a dynamic array INSIDE a struct in C?

But I think this only works for one field per struct?

This code is from http://c.learncodethehardway.org/book/ex17.html

The extra credit section near the bottom of that page contains the bit about changing the sizes to be dynamic.

Upvotes: 0

Views: 209

Answers (4)

David Heffernan
David Heffernan

Reputation: 612794

You can do this using the struct hack, now known as a flexible array. It just requires you to pack both arrays into the flexible part of the struct.

Suppose that you want the arrays to be of length N and M respectively. Then allocate a flexible array as if you were allocating a single array of length N+M. Then use indices 0..N-1 for the first array, and indices N..N+M-1 for the second array.

Upvotes: 0

Vinay
Vinay

Reputation: 188

struct Address 
{
int id;
int set;
char *name;
char *email;
};

Now in the main() function, Use some variable, lets say len to store length of the array, and dynamically allocate required memory using malloc().

int len;
struct Address Add;
printf("Enter the lenght of the array you want?");
scanf("%d",&len);
Add.name=(char *)malloc(len); 
Add.email=(char *)malloc(len);

otherwise you can add len as the member of the struct Address

struct Address 
{
int id;
int set;
int len;
char *name;
char *email;
};

Now in main()

struct Address Add;
printf("Enter the lenght of the array you want?");
scanf("%d",&Add.len);
Add.name=(char *)malloc(Add.len); 
Add.email=(char *)malloc(Add.len);

Upvotes: 0

Adrian Ratnapala
Adrian Ratnapala

Reputation: 5673

I once did this:

struct Thing {
    int Number;
    char *MoreBytes;
    char Bytes[]
}


Thing *MakeThing(int nBytes, int nMoreBytes) 
{
    Thing *th = malloc(sizeof(Thing) + nBytes + nMoreBytes);
    // Error checking is for grrrlz.

    th->Number = 42;
    th->MoreBytes = th->Bytes + nBytes; 

    return th;
}

Thus the array th->Bytes actually holds both "arrays", and the pointer th->MoreBytes tells us where one array ends and another begins.

Upvotes: 3

Lee Duhem
Lee Duhem

Reputation: 15121

It works (at least for GCC 4.7.2) if you put your struct Address definition in a function, like this:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int len = atoi(argv[1]);

    struct Address {
        int id;
        char name[len];
        int set;
        char email[len];
    };

    printf("sizeof(struct Address) = %zu\n", sizeof(struct Address));
    exit(EXIT_SUCCESS);
}

Testing:

$ ./a.out 10
sizeof(struct Address) = 32
$ ./a.out 20
sizeof(struct Address) = 48

Upvotes: 0

Related Questions