Also mal grundlegend:
Code:
o->irgendwas
ist syntactic sugar für
Code:
(*o).irgendwas
.

Nun zum Unterschied:

Bei Variante a) gibt object_new einen object pointer zurück, welcher dann von void blubb wiederum als Argument genommen wird. Das heisst, bei den Funktionsaufrufen wird ein "natürlich grosser" (der Architektur entsprechend heutzutage meist 4 oder 8 byte) Wert (eine Speicheradresse) kopiert.

Bei Variante b) ist ein Durcheinander zwischen object pointers und object values. object_new nimmt als Argument einen object pointer zu einem bereits allozierten object (auf dem Stack in deinem Fall) und macht etwas damit. Dann übergibst du void blubb zwar einen object pointer, erwartet wird aber ein object value (das heisst auch, dass das bei einem korrekten Aufruf das ganze object kopiert würde -- vgl. call-by-value / call-by-reference).

Das printf in Variante b) sollte wohl wie folgt aussehen:
Code:
printf("hello %s", o.irgendwas);
HTH
-- jeebee

PS: mir hat das Buch "The C Programming Language 2nd Edition" von Brian Kernighan und Dennis Ritchie sehr geholfen (auch was Pointer anbelangt), als ich vor Jahren mit C begonnen habe.