#include <stdio.h>
struct expensive; // Forward declaration, ignore
// One could also use a struct expensive * (a pointer) instead
// of this structure. IMO giving it a name is the better option.
struct expensive_handle {
struct expensive * target;
};
// Store the simple data members as usual, store a pointer to a
// handle (pointer) to the expensive ones
struct my_struct {
int simple;
struct expensive_handle * handle;
};
struct expensive {
int content; // whatever
};
struct my_struct * new() {
struct my_struct
* data
= malloc(sizeof(*data
)); // Error handling please
// Set simple data members
data
->handle
= malloc(sizeof(*(data
->handle
))); // Error handling please
data->handle->target = NULL;
return data;
}
int get_expensive(struct my_struct const * ptr) {
if (ptr->handle->target == NULL) {
ptr
->handle
->target
= malloc(sizeof(struct expensive
)); // Error handling please
puts("A hell of a computation just happened!"); ptr->handle->target->content = 42; // WOO
}
return ptr->handle->target->content;
}
int main(void) {
struct my_struct * p = new();
printf("%d\n", get_expensive
(p
)); printf("%d\n", get_expensive
(p
)); }
I2luY2x1ZGUgPHN0ZGlvLmg+CgoKc3RydWN0IGV4cGVuc2l2ZTsgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiwgaWdub3JlCi8vIE9uZSBjb3VsZCBhbHNvIHVzZSBhIHN0cnVjdCBleHBlbnNpdmUgKiAoYSBwb2ludGVyKSBpbnN0ZWFkCi8vIG9mIHRoaXMgc3RydWN0dXJlLiBJTU8gZ2l2aW5nIGl0IGEgbmFtZSBpcyB0aGUgYmV0dGVyIG9wdGlvbi4Kc3RydWN0IGV4cGVuc2l2ZV9oYW5kbGUgewogIHN0cnVjdCBleHBlbnNpdmUgKiB0YXJnZXQ7Cn07CgovLyBTdG9yZSB0aGUgc2ltcGxlIGRhdGEgbWVtYmVycyBhcyB1c3VhbCwgc3RvcmUgYSBwb2ludGVyIHRvIGEKLy8gaGFuZGxlIChwb2ludGVyKSB0byB0aGUgZXhwZW5zaXZlIG9uZXMKc3RydWN0IG15X3N0cnVjdCB7CiAgaW50IHNpbXBsZTsKICBzdHJ1Y3QgZXhwZW5zaXZlX2hhbmRsZSAqIGhhbmRsZTsKfTsKCnN0cnVjdCBleHBlbnNpdmUgewogIGludCBjb250ZW50OyAvLyB3aGF0ZXZlcgp9OwoKCnN0cnVjdCBteV9zdHJ1Y3QgKiBuZXcoKSB7CiAgc3RydWN0IG15X3N0cnVjdCAqIGRhdGEgPSBtYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CiAgLy8gRXJyb3IgaGFuZGxpbmcgcGxlYXNlCiAgLy8gU2V0IHNpbXBsZSBkYXRhIG1lbWJlcnMKICBkYXRhLT5oYW5kbGUgPSBtYWxsb2Moc2l6ZW9mKCooZGF0YS0+aGFuZGxlKSkpOwogIC8vIEVycm9yIGhhbmRsaW5nIHBsZWFzZQogIGRhdGEtPmhhbmRsZS0+dGFyZ2V0ID0gTlVMTDsKICByZXR1cm4gZGF0YTsKfQoKaW50IGdldF9leHBlbnNpdmUoc3RydWN0IG15X3N0cnVjdCBjb25zdCAqIHB0cikgewogIGlmIChwdHItPmhhbmRsZS0+dGFyZ2V0ID09IE5VTEwpIHsKICAgIHB0ci0+aGFuZGxlLT50YXJnZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBleHBlbnNpdmUpKTsKICAgIC8vIEVycm9yIGhhbmRsaW5nIHBsZWFzZQogICAgcHV0cygiQSBoZWxsIG9mIGEgY29tcHV0YXRpb24ganVzdCBoYXBwZW5lZCEiKTsKICAgIHB0ci0+aGFuZGxlLT50YXJnZXQtPmNvbnRlbnQgPSA0MjsgLy8gV09PCiAgfQogIHJldHVybiBwdHItPmhhbmRsZS0+dGFyZ2V0LT5jb250ZW50Owp9CgppbnQgbWFpbih2b2lkKSB7CiAgc3RydWN0IG15X3N0cnVjdCAqIHAgPSBuZXcoKTsKICBwcmludGYoIiVkXG4iLCBnZXRfZXhwZW5zaXZlKHApKTsKICBwcmludGYoIiVkXG4iLCBnZXRfZXhwZW5zaXZlKHApKTsKfQo=