Hacker News new | past | comments | ask | show | jobs | submit login

I've commonly seen it used for both. Really anything that the function will write to.



> I've commonly seen it used for both

That's a good reason to rename one of them because they're completely different semantics and behaviour, and confusing one for the other is a direct route to segfault city.


From another perspective, they're both performing the same operation on different types. With what you'd call "destination passing", like

    char *buf = malloc(128);
    snprintf(buf, 128, "hello");
the function is accepting a pointer to an uninitialized array of char, and initializing the array of char. With what you'd call an "out parameter", like

    char *buf;
    asprintf(&buf, "hello");
the function is accepting a pointer to an uninitialized pointer to array of char, and initializing the pointer. The caller still controls the allocation of storage for the pointer itself.


At this point of the lifetime C-language, hoping for the commonly accepted terminology to change, is probably futile. Anyway, for out parameters, the common convention is:

Caller provides one object for output:

   void callee(Obj *obj);
Caller provides an array for output:

    void callee(Obj *obj, size_t obj_size);
Caller provides an pointer, to which callee allocates a new object:

    void callee(Obj **obj)




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: