I've just started a course about C programming and I'm stuck with the malloc() function. I've a code to implement a linked list of segments.
#include <stdlib.h>
#include <stdio.h>
typedef struct{
struct {
double x, y;
} point;
void *next;
void *prev;
} segment_t;
typedef struct {
segment_t *first;
segment_t *last;
} poly_t;
Now, if I want to allocate the memory for the struct segment_t, should I allocate also the memory for the two void pointers *next and *prev?
And the same for *first and *last inside the poly_t structure?
Thanks for the help!
malloc(sizeof(segment_t)) allocates enough memory for the entire structure, including x, y, next and prev.
It doesn't initialize any of those members, however. If you want next and prev to point to something, you will need to assign a pointer to them. Whether it's a freshly allocated pointer (malloc(...)) or an existing one (incl NULL) is up to you.
In this particular case, an instance of segment_t is a node of a doubly-linked list. As such, s->next and s->prev should be initialized to NULL until the node (segment) is added to the list.
As mentioned by @Vlad from Moscow, you shouldn't be using void* for the pointers, but the following:
typedef struct segment {
struct {
double x, y;
} point;
struct segment *next;
struct segment *prev;
} segment_t;
For starters it is unclear why within the structure the pointers have the type void *. This only confuses readers of the structure definition
typedef struct{
struct {
double x, y;
} point;
void *next;
void *prev;
} segment_t;
Whether you mean
typedef struct{
struct point{
double x, y;
} point;
struct point *next;
struct point *prev;
} segment_t;
or you mean
typedef struct segment {
struct {
double x, y;
} point;
struct segment *next;
struct segment *prev;
} segment_t;
So change the structure definition accordingly to its usage.
If you want to allocate memory for an object of the type segment_t or poly_t then the object should be initialized ultimately. For example the pointers next, prev, first, and last initially can be initialized by NULL.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With