Часть вашей проблемы заключается в том, что вы не учитываете одну из частей информации, которую вы должны передать вызывающей стороне: эффективное число целых чисел в возвращаемом массиве. Ваш цикл печати предполагает то же количество элементов, что и при первоначальном прочтении, но по природе функции это обычно будет слишком много.
Вы спрашиваете,
как стереть клетки?
, но «стирание» - это не то, что вы можете сделать. Вы можете перезаписывать элементы массива различными значениями, но нельзя заставить отдельный элемент массива перестать существовать, особенно не с середины массива. Обычная идиома состоит в том, чтобы поместить элементы, которые вы хотите сохранить, в исходные элементы либо исходного, либо нового массива, и вернуть количество этих элементов. В случае нового массива вы также должны вернуть указатель на (динамически размещаемый) массив. Представленная вами сигнатура функции не подходит, потому что она не дает хороших средств для возврата количества элементов.
Существует несколько способов решения этой проблемы. Проще всего было бы сделать number
параметром in / out, передав указатель на количество элементов вместо значения количества элементов:
int *new_array(int *p, int *number, int is_even) {
// ... 'j' keeps a running count of the number of is_even elements
*number = j; // Write the final number of elements back to the caller
return p; // return the allocated array
}
Детали реализации должны будут немного измениться, чтобы учесть изменение типа и использования параметра number
, а также для исправления ошибок.
Тогда вы можете назвать это так:
p = new_array(p, &n, is_even);
... и потом продолжайте, как вы уже делали.