4 ms·
>There have been no proposals to add new array types and it doesn't seem likely at the core language level. One alternative to adding types is to allow enforci
by scythe 7y ago
>There have been no proposals to add new array types and it doesn't seem likely at the core language level.
One alternative to adding types is to allow enforcing consistency in some structs with the trailing array:
struct my_obj {
const size_t n;
//other variables
char text[n];
};
where for simplicity you might only allow the first member to act as a length (and it must of course be constant). The point is that then the initializer:
struct my_obj b = {.n = 5};
should produce an object of the right size. For heap allocation you could use something like:
void * vmalloc(size_t base, size_t var, size_t cnt) {
void *ret = malloc(base + var * cnt);
if (!ret) return ret;
* (size_t *) ret = cnt;
return ret;
}
- jschwartzi 7y agoI would love this.
- saagarjha 7y agoWhat should happen if you reassign the object?
- scythe 7y agoWhat do you mean "reassign"? You can't reassign the length variable since it's marked `const`. You should see something like "warning: assignment discards `const` qualifier from pointer target type" if you pass it to `realloc`, which tells you that you're breaking consistency (I guess this might be UB). You could write `vrealloc` to allow resizing such structs, which would probably be called like: my_obj *tmp = vrealloc(obj, sizeof(obj), sizeof(obj->text), obj->n, newsize);