Csi
Csi

Reputation: 526

creating an array containing pointers

I'm trying to create an array of pointers in C. Each value of the array should be a pointer to a struct (let's call it struct Type*).

Should i do

struct Type* myVariable= malloc(sizeof(struct Type*)*MY_SIZE);

or

struct Type** myVariable= malloc(sizeof(struct Type*)*MY_SIZE);

The second one looks like what i should do when i want to create a two dimensional array, which are an array of pointer, and those pointers are used to create arrays of the wanted type. EDIT : But in my case the second dimension size would be only one

The first one looks like a regular array with int* as the contained values type.

How can i pass the good solution to a function (by pointer, not by value because the array may be fairly large) and use it in the fonction ?

Upvotes: 1

Views: 96

Answers (2)

R Sahu
R Sahu

Reputation: 206747

The second one the right solution. However, you'll need to allocate memory for the objects too. Also, make sure to check the value returned by malloc.

// Allocate memory for the array of pointers.
struct Type** myVariable = malloc(sizeof(struct Type*)*MY_SIZE);
if ( myVariable == NULL )
{
   // Deal with error
   exit(1);
}

for (int i = 0; i < MY_SIZE; ++i )
{
   // Allocate memory for the array of objects.
   myVariable[i] = malloc(sizeof(struct Type)*THE_SIZE_IN_THE_OTHER_DIMENSION);
   if ( myVariable[i] == NULL )
   {
      // Free everything that was allocated so far
      for (int j = 0; j < i-1; ++j )
      {
         free(myVariable[j]);
      }
      free(myVariable);

      // Exit the program.
      exit(1);
   }
}

However, if THE_SIZE_IN_THE_OTHER_DIMENSION is going to be 1, you are better off using your first approach.

struct Type* myVariable = malloc(sizeof(struct Type)*MY_SIZE);
                                     // ^^^^^^^^^^^ Drop the *
if ( myVariable == NULL )
{
   // Deal with error
   exit(1);
}

Upvotes: 2

chux
chux

Reputation: 154592

Neither!

Use an idiom that reduces work and errors

pointer = malloc(sizeof *pointer * Number_of_elements);

Or in OP's case "to create an array of pointers in C"

#define ARRAY_N 100
struct Type **myVariable = malloc(sizeof *myVariable * N);
if (myVariable == NULL) Handle_OutOfMemmory();

Now set those pointers to some value

#define M 50
size_t i;
for (i=0; i<N; i++) {
  myVariable[i] = malloc(sizeof *(myVariable[i]) * M);
  if (myVariable[i] == NULL) Handle_OutOfMemmory();

  for (size_t m = 0; m<M; m++) {
    // Initialize the fields of 
    myVariable[i][m].start = 0;
    myVariable[i][m].value = 0.0;
    myVariable[i][m].set = NULL;
  }
}

Upvotes: 0

Related Questions