Вероятно, нет необходимости делать memset
: возможно, вы не используете colors[k]
перед тем, как установить его с чем-то действительным позже. Например, ваш код устанавливает colors[i]
для недавно выделенного указателя color
, поэтому вам не нужно устанавливать colors[i]
в NULL
.
Но, даже если вы хотите «обнулить его, чтобы все было хорошо», или действительно хотите, чтобы новые указатели были NULL
: стандарт C не гарантирует, что ноль всех битов является константой нулевого указателя (то есть NULL
), поэтому memset()
в любом случае не является правильным решением.
Единственная переносимая вещь, которую вы можете сделать, это установить каждый указатель на NULL
в цикле:
size_t k;
for (k=COLORCOUNT; k < i+1; ++k) /* see below for why i+1 */
colors[k] = NULL;
Ваша основная проблема в том, что ваш realloc()
звонок неправильный. realloc()
возвращает указатель на измененный размер памяти, он (не обязательно) изменяет размер на месте.
Итак, вы должны сделать:
/* i+1 because you later assign to colors[i] */
rgb_t **tmp = realloc(colors, (i+1) * sizeof *tmp);
if (tmp != NULL) {
/* realloc succeeded, can't use colors anymore */
colors = tmp;
} else {
/* realloc failed, colors is still valid */
}
Если вы действительно хотите знать, каким должен быть вызов memset()
, вам нужно обнулить память, начиная с colors+COLORCOUNT
, и установить i+1-COLORCOUNT
членов на ноль:
memset(colors+COLORCOUNT, 0, (i+1-COLORCOUNT) * sizeof *colors);
Но, как я сказал выше, ноль всех байтов не обязательно является указателем NULL
, поэтому ваш memset()
в любом случае бесполезен. Вы должны использовать цикл, если вы хотите NULL
указатели.