Это почти наверняка, потому что вы выходите за пределы массива. Максимальное значение k
равно MAXRECORDS-1
, и вы используете k+1
в выражениях.
Это означает, что вы получите доступ к array[MAXRECORDS]
, где индекс должен быть ограничен от 0
до MAXRECORDS - 1
включительно.
Сложно увидеть, что вы пытаетесь сделать без дополнительного контекста, но исправление может быть таким же простым, как использование k < MAXRECORDS - 1
в качестве условия продолжения цикла for
(бит в середине) :
for (k = i; k < MAXRECORDS - 1; k++) {
Возможность other является недопустимым значением i
, например, -1
, что может вызвать проблему на другом конце массива. Это, вероятно, менее вероятно, так как я предполагаю, что вы удаляете элемент i
, сдвигая все остальные элементы вниз (как в: i
будет установлен в допустимый индекс).
Кстати, это не память утечка , просто повреждение памяти. Утечки памяти - это когда вы выделяете память, а затем теряете указатели на них, чтобы их никогда не освободить, что-то вроде:
char *x;
for (i = 0; i < 10; i++)
x = malloc (64);
, где доступно только последнее распределение.
Кстати, если вы хотите использовать случайное удаление, это будет лучше сделать (на мой взгляд) как:
// For every element where there's a non-NULL next element,
// shift that element down. Then force the last element to
// be NULL (it will have been shifted down already).
for (k = i; (k < MAXRECORDS - 1) && (slist->servers_ptr[k+1] != NULL); k++)
slist->servers_ptr[k] = slist->servers_ptr[k+1];
slist->servers_ptr[k] = NULL;
Дополнительное условие останавливается, когда следующий элемент равен NULL, и помещает NULL в эту позицию. Это должно работать нормально и иметь преимущество в том, что оно менее сложное.