Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C modern array allocation?

Tags:

arrays

c

struct

I have some code to create a new struct and allocate some space for an array of structs. Initially, I allocate space for 1 struct on the array:

static int datasetCount = 0;

int datasetgroup_new(DatasetGroup *dg char *id){

  dg->id = id;

  // Allocate space for a single dataset to start with
  dg->datasets = (Dataset *) malloc(sizeof(Dataset));

  return 0;

}

I then have a function to add another struct ('dataset') to the struct containing the array. At the end of the function, I reallocate the array to provide another space:

void datasetgroup_add(DatasetGroup *dg, string filePath){

  // Create the dataset
  Dataset ds;
  dataset_new(&ds, filePath);

  // Copy the dataset to the dataset array
  dg->datasets[datasetCount] = ds;

  // Increment the dataset counter
  datasetCount++;

  //Grow the array
  dg->datasets = (Dataset *)realloc(dg->datasets, sizeof(Dataset) * (datasetCount + 1));

}

I keeping reading things that hint that in modern C you don't need to do stuff like this. I may be wrong...so is the a more modern/correct way to do this?

Edit:

Sorry, to be clear that I am not using C++ types, I have created a typedef for string:

typedef char* string;
like image 209
jramm Avatar asked Mar 17 '23 07:03

jramm


1 Answers

As mentioned here there is nothing for this in modern C (C11) standard but you can use libraries like Glib in order to easier memory management or you can use it's data structures like array.

If you use visual studio may be you could find some non-standard function for this in that.

To be more specified in linux, these functions just wrapper for brk() system call and all of them do memory management in user space and their speed and efficiently depend on their algorithms, for example GNU C Library get some space in heap and then manage it for you so not all of your realloc() call end into brk() system call, so do not worry yourself about their efficiently so much. you can use valgrind in order to see your memory profiling.

like image 127
Parham Alvani Avatar answered Mar 28 '23 17:03

Parham Alvani