|
|
|
|
|
by eMSF
2245 days ago
|
|
There is no issue here (except the one highlighted by joejev). Many standard library functions return a pointer which they got as a parameter (or another pointer offset from it, as is the case here). The compound literal is no more "temporary" than a variable that was introduced right before the function call. Lifetimes of compound literals are specified in section 6.5.2.5 of both C99 and C11. func((int[256]){ 0 });
// is mostly equivalent to
int __a__[256] = { 0 };
func(__a__);
|
|
Obviously. But this does not extend the lifetime of the buffer they are passed. Namely you can't use this as a technique to extend the life of automatic storage falling out of scope.
> Lifetimes of compound literals are specified in section 6.5.2.5 of both C99 and C11.
This is what I was missing. So it is valid by the standard. Which is good if you have looked it up. It remains not obvious when reading source without a copy of the standard on hand, or prior knowledge of that section. Passing an expression of that sort and keeping a pointer to it visually looks like the intent is to retain a pointer of more limited scope. Intuitively it would make just as much sense if the lifetime were shorter. If you are seeking clarity of intent this is not a great thing to rely upon.