Ranier Vilela <ranier.vf@gmail.com> 于2020年11月10日周二 下午9:54写道:
>
> Ok, I think that it was very clear.
> But C programmer shouldn't worry about filling memory with NULLs,
The point is as Andrew Gierth said , "modern compilers will
transform assignment loops into memset calls or inline implementations
of memset if circumstances suggest it will be both allowable and
efficient to do so" .
In my opinion, better C code should express the programmer's intention directly.
We need init the array with NULLs, memset is only a shallow
optimization that the compilers can do it well.
The cut took out of context.
I said "when".
And yet, in many cases, it is not necessary to initialize the array with NULLs, especially if it is a large array.
Good C codes are always defensive.
I usually code like this:
char * names[32000];
names[0]=NULL;
void func(names, size) {
unsigned int i;
for(i = 0; i < size; ++i) {
if (names[i] == NULL) { /* end of array? */
break;
}
// etc etc etc
}
return;
With one simple move, will reset the entire array.
Another example:
struct array {
sizet_t size;
size_t alloc;
struct * mystruct[1];
} ARRAY;
ARRAY * mt;
mt->size = 0; /* reset the entire array */
void func(ARRAY * mt) {
unsigned int i;
unsigned size = mt->size; /* array length */
for(i = 0; i < size; ++i) {
// etc etc etc
}
Again, with one simple move, will reset the entire array.
No need to reset with NULLs, the entire array.