Reputation: 1
Confused in some example with realization of trivial intrusive container in C. I have structures:
struct List {
struct Link* first;
struct Link* last;
};
And Link for become the nodes of list:
struct Link {
struct Link* pre;
struct Link* suc;
};
Some pseudo Node for storing specified values in List:
struct Name {
struct Link lnk;
char* n;
};
Function for pushing values in List:
void push_back(struct List* lst, struct Link* p) {
assert(lst);
{
struct Link* last = lst->last;
if (last) {
p->pre = last;
last->suc = p;
}
else {
lst->first = p;
p->pre = 0;
}
lst->last = p;
p->suc = 0;
}
}
And usage of List:
int main() {
int count = 0;
struct List names;
struct Link* curr;
init(&names);
push_back(&names, (struct Link*)make_name("Norah"));
push_back(&names, (struct Link*)make_name("Annemarie"));
push_back(&names, (struct Link*)make_name("Kris"));
curr = names.first;
for (; curr != 0; curr = curr->suc) {
count++;
printf("element %d: %s\n", count, ((struct Name*)curr)->n);
}
return 0;
}
Question is, how typecast is working in this example? when sizeof(Link)==8
and sizeof(Name)==12
The pointer curr
pointing to allocated memory for type Name
, this structure not have suc
and pre
members,just lnk
object of type Name
(not pointer), and in code no any primary access for this member.
Upvotes: 0
Views: 183
Reputation: 1
Thanks guys! Im lost from mind that struct Link
have two first members which each one 4 bytes. When struct Name
is come to push_back()
via argument, the function is operate with him like a struct Link
.Cuz struct Name
have 8 byte member in a head, functions just placing data about suc
and pre
members in this 8 bytes. I can replace lnk
member from Name
to any other with data with size 8 bytes.
Have i nice day!
Upvotes: 0
Reputation: 2736
It is relying on the fact that struct Link
is the first field of the struct Name
. You can pretend the 12 bytes pointed to by a struct Name*
is actually an 8 byte struct Link
, and disregard the remaining 4 bytes. See the following questions:
Upvotes: 1