Robin Huang
Robin Huang

Reputation: 423

How to create a new instance of a struct

What is the correct way to create a new instance of a struct? Given the struct:

struct listitem {
    int val;
    char * def;
    struct listitem * next;
};

I've seen two ways..

The first way (xCode says this is redefining the struct and wrong):

struct listitem* newItem = malloc(sizeof(struct listitem));

The second way:

listitem* newItem = malloc(sizeof(listitem));

Alternatively, is there another way?

Upvotes: 33

Views: 167697

Answers (4)

Besides the other answers I'd like to add two more compact ways of creating instances. Example:

struct Person{
    float position[2];
    int age;
    char name[20];
}
struct Person p1 = { {4, 1.1}, 20, "John" };
struct Person p2 = { .age=60, .name="Jane", .position={0, 0} };
printf("%s, aged %i, is located at (%f, %f)\n", p1.name, p1.age,p1.position[0], p1.position[1] );
printf("%s, aged %i, is located at (%f, %f)\n", p2.name, p2.age,p2.position[0], p2.position[1] );

output:

John, aged 20, is located at (4.000000, 1.100000)
Jane, aged 60, is located at (0.000000, 0.000000)

Note that for p1 the order of properties matches that of the struct definition. If you don't want to type struct all the time when you use a type you can define a new alias using

typedef struct Person SomeNewAlias;
SomeNewAlias p1;

and you can call the new alias the same as the old namejust fine

typedef struct Person Person;
Person p1;

Upvotes: 5

Prog_is_life
Prog_is_life

Reputation: 874

It depends if you want a pointer or not.

It's better to call your structure like this :

typedef struct s_data 
{
    int a;
    char *b;
    // etc..
} t_data;

After to instanciate it for a no-pointer structure :

t_data my_struct;
my_struct.a = 8;

And if you want a pointer you need to malloc it like that :

t_data *my_struct;
my_struct = malloc(sizeof(t_data));
my_struct->a = 8

I hope this answers your question.

Upvotes: 37

user539810
user539810

Reputation:

The second way only works if you used

typedef struct listitem listitem;

before any declaration of a variable with type listitem. You can also just statically allocate the structure rather than dynamically allocating it:

struct listitem newItem;

The way you've demonstrated is like doing the following for every int you want to create:

int *myInt = malloc(sizeof(int));

Upvotes: 21

Scott G.
Scott G.

Reputation: 323

struct listitem newItem; // Automatic allocation
newItem.val = 5;

Here's a quick rundown on structs: http://www.cs.usfca.edu/~wolber/SoftwareDev/C/CStructs.htm

Upvotes: 4

Related Questions