3 ms·
>In your example there's no guarantee that the length will be accurate, or that the data hasn't been modified independently elsewhere in the program. And havin
by dooglius 7y ago
>In your example there's no guarantee that the length will be accurate, or that the data hasn't been modified independently elsewhere in the program.
And having a special data-and-length type would make these guarantees... how? You're ultimately going to need to be able to create these objects from bare data and length somehow, so it's a case of garbage-in-garbage-out.
- gbear605 7y agoDeclaring it with a custom struct: int raw_arr[4] = {0,0,0,0}; struct SmartArray arr; arr.length = 4; arr.val = raw_arr; some_function(arr); Smart declaration with custom type: (assume that they'll come up with a good syntax) smart_int_arr arr[4] = {0,0,0,0}; some_function(arr); With the custom struct, it requires the number `4` to be typed twice manually, while in the second it only needs a single input.
- fkeeal 7y agoYou actually never need to specify the size explicitly in C. Here are some other ways to declare your struct without needing as much boiler plate per declaration. #define MAKE_SMARTARRAY(_smartarr, _array) \ do {\ _smartarr.val = (_array);\ _smartarr.len = sizeof((_array))/sizeof((_array[0]));\ }while(0) struct SmartArray { int *val; int len; }; int main() { int array[] = {0,0,0,0}; struct SmartArray arr = {.val = array, .len = sizeof(array)/sizeof(array[0])}; struct SmartArray arr2; struct SmartArray arr3; MAKE_SMARTARRAY(arr2, ((int[]){5,6,7,8})); MAKE_SMARTARRAY(arr3, array); return 0; }
- flatfinger 7y agoHow about having an attribute which, if applied to a structure that contains a `T*` and an integer type, would allow a `T[]` to be implicitly converted to that structure type?