struct payload{
struct metadata meta;
char data_pointer[0];
};
struct payload* mypayload = (struct payload*) malloc(sizeof(struct payload) + 50);
What is the type of mypayload here? The address, pointer, or something else
struct payload{
struct metadata meta;
char data_pointer[0];
};
struct payload* mypayload = (struct payload*) malloc(sizeof(struct payload) + 50);
What is the type of mypayload here? The address, pointer, or something else
malloc
returns an untyped chunk of memory, and the assignment is how you tell the compiler what type it is. In this case struct payload *
which is a pointer (an address) of the memory that was allocated or NULL if the allocation failed.
You don't need the cast (struct payload*)
.
If you want data_pointer
to be a flexible array member, then you leave the size unspecified char data_pointer[];
. An array of size 0
is undefined behavior.
What is the type of
mypayload
here?
mypayload
is a pointer, a pointer to a struct payload
. @kaylum
A struct
array member with size 0, like char data_pointer[0];
is not defined by C although some implementations had allowed it as a pre-cursor to a flexible array member (FAM).
Since C99 use char data_pointer[];
to define the last member as a flexible array member.
To best allocate for a flexible array member, compute the sum of 2 sizes:
sizeof mypayload[0]
: Size of the object up to, but not including the FAM member. This will include any padding before the FAM member.
sizeof mypayload->data_pointer[0]
: Size of the FAM referenced data times the count, 50, of array elements desired.
Tip: a type is not needed in the sizeof
code. Easier to code right, review and maintain to use the size of the referenced object.
Tip: Cast not needed.
Tip: Check for allocation success.
Example:
struct payload{
struct metadata meta;
char data_pointer[]; // No 0
};
struct payload* mypayload = malloc(
sizeof mypayload[0] +
sizeof mypayload->data_pointer[0] * 50);
if (mypayload == NULL) {
; // TBD code to handle out-of-memory
}
mypayload
is a pointer. It's a pointer to the memory allocated by malloc()
. And you have it configured as a pointer to a payload
.