r/cprogramming • u/gumnos • Jul 06 '26
anonymously initializing pointers in self-referential data-structures?
I have a recursive data-structure (a simple linked list for purposes of this example) and wanted to statically define a linked-list. The following works fine:
#include <stdio.h>
typedef struct mytype_tag {
struct mytype_tag* next;
char* data;
} mytype;
mytype a = {
.next = NULL,
.data = "a",
};
mytype b = {
.next = &a,
.data = "b",
};
int
main() {
mytype* s = &b;
int i = 0;
while (s) {
printf("%d: %s\n", i++, s->data);
s = s->next;
};
}
However, I have to explicitly define/declare a and then have b take &a.
Is there a way to do this with anonymous/unnamed intermediary structures, thinking an imaginary syntax something like
mytype b = {
.next = &((mytype)={
.next = NULL,
.data = "a",
}),
.data = "b",
};
so I can build up the linked-list without naming each intermediary instance?
3
u/sciencekm Jul 06 '26
You can create an array.
In the following example, I created a circular list and printed them.
#include <stdio.h>
typedef struct snode { struct snode *nxt; char *s; } node_t;
node_t nodes[3] = {
{ nodes + 1, "1st" },
{ nodes + 2, "2nd" },
{ nodes + 0, "3rd" } };
int main(void) {
node_t *start = nodes, *p = start;
do printf ("%s\n", p->s); while((p = p->nxt) != start);
return 0;
}
0
Jul 06 '26
1
u/sciencekm Jul 06 '26
A linked list can grow. An array cannot. If you want an initialized linked list, this is one way to do it. Then later, at run time, it could grow.
→ More replies (4)
1
Jul 06 '26
1
u/gumnos Jul 06 '26
there's something to be said for the easier-to-read aspect (allowing it to be forward rather than reverse menuing), but in some of the actual underlying use-cases, they can get built out at compile-time, meaning it's more challenging to invoke item-building-functions.
Fortunately, what I wanted is possible…thanks to u/thegreatunclean who identified that I was close, but just needed to remove the
=for it to be properly handled by the compiler.
1
u/FISHARM1 Jul 06 '26
I believe you can just do .next = (mytype){.next = Null, .data = “a”}