реаллок памяти в строковом массиве в C - PullRequest
3 голосов
/ 10 апреля 2011

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

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

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

Я делаю некоторыеманипулирование строкой и попробуйте сделать:

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

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

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

Любые намеки будут с благодарностью.

Ответы [ 2 ]

4 голосов
/ 10 апреля 2011

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

2 голосов
/ 10 апреля 2011

Почему realloc ing arr[1] требует каких-либо изменений?

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

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

...