Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically allocate memory for Array of Structs

Here's what I'm trying to do:

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

struct myStruct {
    int myVar;
}

struct myStruct myBigList = null;

void defineMyList(struct myStruct *myArray)
{
     myStruct *myArray = malloc(10 * sizeof(myStruct));

     *myArray[0] = '42';
}

int main()
{
     defineMyList(&myBigList);
}

I'm writing a simple C program to accomplish this. I'm using the GNU99 Xcode 5.0.1 compiler. I've read many examples, and the compiler seems to disagree about where to use the struct tag. Using a struct reference inside the sizeof() command doesn't seem to recognize the struct at all.

like image 289
Mark Löwe Avatar asked Mar 22 '23 16:03

Mark Löwe


2 Answers

There are a few errors in your code. Make it:

struct myStruct *myBigList = NULL; /* Pointer, and upper-case NULL in C. */

/* Must accept pointer to pointer to change caller's variable. */
void defineMyList(struct myStruct **myArray)
{
     /* Avoid repeating the type name in sizeof. */
     *myArray = malloc(10 * sizeof **myArray);

     /* Access was wrong, must use member name inside structure. */
     (*myArray)[0].myVar = 42;
}

int main()
{
     defineMyList(&myBigList);
     return 0; /* added missing return */
}

Basically you must use the struct keyword unless you typedef it away, and the global variable myBigList had the wrong type.

like image 58
unwind Avatar answered Apr 01 '23 02:04

unwind


This is because struct name is not automatically converted into a type name. In C (not C++) you have to explicitly typedef a type name.

Either use

struct myStruct instance;

when using the type name OR typedef it like this

typedef struct {
    int myVar;
} myStruct;

now myStruct can simply be used as a type name similar to int or any other type.

Note that this is only needed in C. C++ automatically typedefs each struct / class name.

A good convention when extending this to structs containing pointers to the same type is here

like image 34
fkl Avatar answered Apr 01 '23 02:04

fkl