Вам не нужен еще один временный массив, если вы просто хотите удалить одну запись. Все, что вам нужно сделать, это:
- Найдите запись, которую вы хотите удалить (возможно, у вас уже есть индекс или вы можете искать контент).
- Освободите эту запись .
- Переместить все остальные записи назад на одну позицию (или просто переместить последнюю на место той, которая была удалена, если вам не нужен порядок, это намного быстрее).
- Перераспределите с
realloc()
, чтобы изменить размер массива.
Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ENTRY_SIZE 10
int main(void) {
size_t size = 5;
char **arr, **tmp;
size_t i;
arr = malloc(sizeof(char *) * size);
if (arr == NULL) {
perror("malloc failed");
return 1;
}
for (i = 0; i < size; i++) {
arr[i] = malloc(sizeof(char) * ENTRY_SIZE);
if (arr[i] == NULL) {
perror("malloc failed");
return 1;
}
}
strcpy(arr[0], "apple");
strcpy(arr[1], "cat");
strcpy(arr[2], "dog");
strcpy(arr[3], "sun");
strcpy(arr[4], "moon");
// Search for "dog" and remove it if found
for (i = 0; i < size; i++) {
if (!strcmp(arr[i], "dog")) {
free(arr[i]);
break;
}
}
// If "dog" was found and removed
if (i < size) {
// Move all elements after "dog" back one position
for (; i < size - 1; i++)
arr[i] = arr[i + 1];
// Resize the array
size--;
tmp = realloc(arr, sizeof(char *) * size);
if (tmp == NULL) {
perror("realloc failed");
return 1;
}
arr = tmp;
}
// Print everything to show the results
for (i = 0; i < size; i++)
printf("%d: %s\n", i, arr[i]);
// Free everything
for (i = 0; i < size; i++)
free(arr[i]);
free(arr);
return 0;
}
Результат:
0: apple
1: cat
2: sun
3: moon
Если вас не волнует порядок элементов, вам не нужно перемещать все из них, просто переместите последний вместо удаленного:
if (i < size) {
arr[i] = arr[size - 1];
size--;
tmp = realloc(arr, sizeof(char *) * size);
// Same as above...
}
Результат:
0: apple
1: cat
2: moon
3: sun