перераспределение памяти в строковом массиве на языке Си


Я пытаюсь удовлетворить валгринда и придумать хорошую реализацию, но я натыкаюсь на препятствие. По сути, я пытаюсь свести две строки в массиве к одной. Допустим, arr содержит

{ "One", "Two", "Three" }

И что выделение памяти для каждой строки было сделано так, как это должно быть (a la arr[1] = malloc(strlen("one") + 1) и strcpy(arr[1], "One").

Я делаю некоторые манипуляции со строками и пытаюсь сделать:

Strcpy (arr[1], "OneTwo");

И удалить arr[2], но это по своей сути проблема в том, что распределение памяти для arr [1] изменилось. Что-то подсказывает мне, что делать Мэллок снова было бы плохо.

Я мог бы сделать realloc, но для этого потребуется либо освободить arr[2] и переместить все после него на один пробел и перераспределить. Я тоже мог бы это сделать, но валгринд не согласен.

Любые намеки будут высоко оценены.

2 3

2 ответа:

Перераспределите arr[1] и добавьте arr[2] к концу строки, затем освободите arr[2] (и установите arr [2] = NULL, чтобы избежать путаницы позже).

Почему realloc ing arr[1] требует какой-либо модификации чего-либо еще?

strcpy( arr[1] = realloc( arr[1], sizeof "OneTwo" ), "OneTwo" );
free( arr[2] );
arr[2] = NULL;

Выглядит неплохо. Здесь нет ничего после arr[2], так что никакого сдвига не нужно делать. Если были, то да, удаление из середины любого массива требует, чтобы вы сдвинули вниз следующие элементы.