перераспределение памяти в строковом массиве на языке Си
Я пытаюсь удовлетворить валгринда и придумать хорошую реализацию, но я натыкаюсь на препятствие. По сути, я пытаюсь свести две строки в массиве к одной. Допустим, 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 ответа:
Перераспределите
arr[1]
и добавьтеarr[2]
к концу строки, затем освободитеarr[2]
(и установите arr [2] = NULL, чтобы избежать путаницы позже).
Почему
realloc
ingarr[1]
требует какой-либо модификации чего-либо еще?strcpy( arr[1] = realloc( arr[1], sizeof "OneTwo" ), "OneTwo" ); free( arr[2] ); arr[2] = NULL;
Выглядит неплохо. Здесь нет ничего после
arr[2]
, так что никакого сдвига не нужно делать. Если были, то да, удаление из середины любого массива требует, чтобы вы сдвинули вниз следующие элементы.