3 ms·
m[MAX] means you can't usefully use sizeof A really nice use for a VLA would be in the middle of a struct. You could make something like a PNG image file chunk
by burfog 8y ago
m[MAX] means you can't usefully use sizeof
A really nice use for a VLA would be in the middle of a struct. You could make something like a PNG image file chunk as a struct, with the CRC at the end coming after the VLA. You get a struct of the correct size with the right fields, despite one part of the struct being of variable size.
- SamReidHughes 8y agoYou’d need the VLA length encoded somewhere in the struct, though.
- burfog 8y agoNo you don't. It is a separate variable. For example, a parameter n is passed to a function, and then a struct is defined based on n. struct { uint32_t header; uint32_t array[n]; uint32_t footer; }foo; The function fills in the struct. Maybe it then sends the struct via a packet-oriented protocol, perhaps over a datagram socket, so the length is transmitted implicitly in the packet size.
- SamReidHughes 8y agoThat’s different from a VLA, which doesn’t use dependent typing or any reliance on users keeping variables unmodified to guarantee they clean up the stack properly.
- burfog 8y agoIt is a VLA. See the second example: https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html There is no problem cleaning the stack because the compiler has numerous ways to do that. One way is to keep a copy of the original n, as passed to the function. Another way is to save the original stack pointer. Making this work is not much harder than supporting the alloca function.
- SamReidHughes 8y agoThen you have to read part of the file, read some size fields, make a struct on the stack (for an image file??), copy the stuff you've read in already into that struct, and keep reading. And you now need to define how to pass a pointer of that struct type to helper functions for operating on a PNG.
- burfog 8y agoI mean for generating a PNG file, not reading one. It's not the best example I'm sure; it's just what popped into my head. If you prefer, it's an Ethernet packet, with a CRC16 on the end. It is outbound. The send() and write() functions are happy to accept a void pointer.
- Dylan16807 8y agoWhy use sizeof when you already have n? I could see it possibly being useful but not often.