Reputation: 423
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
Reputation: 390
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
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
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
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