2016-09-15 3 views
-2

Что я хочу сделать, это выделить char** stringarr.c: свободный символ * без разрушения char **

В некоторых местах, stringarr[index], я хочу назначить char*. Так что я хочу сохранить строки (char*) в некоторых местах char **. Например после того как программа не закончилась:

stringarr[0] = "Hello", stringarr[1] = "goodbye" 

Проблема заключается в том, что я хочу, чтобы освободить char * удерживающие строки, но когда я делаю конечно stringarr[0] больше не будет указывать на освобожденную char*.

Как я могу это решить?

Чтобы уточнить: Я хочу добавить строки (char *) в массив строк (char **). Затем я освобождаю строки, но не строковый массив. Как я могу это сделать, не затрагивая char **?

+2

_Пожалуйста, уточните вашу конкретную проблему или добавьте дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить» для получения справки об этом вопросе._ –

+0

[Как спросить страницу] (http://stackoverflow.com/help/how-to-ask) – gavv

+0

Вышеупомянутый код устанавливает 'stringarr [0]' в точку в строковый литерал, который не может быть освобожден. Самое большее, что вы можете сделать, это установить 'stringarr [0]' на что-то другое, например 'NULL'. Если вместо этого вы делаете что-то вроде 'char * foo = malloc (10); strcpy (foo, "fred"); stringarr [0] = foo; ', и вы позже называете' free (foo) ', это зависит от вашего кода, чтобы гарантировать, что он никогда не обращается к буферу, на который указывает' stringarr [0] '. Как вы это достигаете, это зависит от вас. Убедившись, что ваш код сбрасывает 'stringarr [0] = NULL;' после освобождения 'foo' и всегда всегда проверяет, является ли' stringarr [0] 'NULL или нет, является одним из способов его достижения. –

ответ

1

Обычный способ справиться с этим, чтобы назначить NULL на освобожденный указатель (ы):

free(stringarr[3]); 
stringarr[3] = NULL; 

Вы все еще можете получить доступ к другим строкам в stringarr (но не stringarr[3]), и вы можете проверить, является ли конкретным если вакансия NULL.

+0

Как это может работать? У меня есть char ** stringarr, на месте stringarr [0] У меня есть char * tmp. Затем я освобождаю stringarr [0] и устанавливаю его в NULL? И все же у меня есть строка в 0, и строка освобождается? – p3ob2lem

+0

Вы хотите сохранить струны? Затем либо не освобождайте их, либо используйте 'strdup' для создания копии. –

+0

Да, я хочу сохранить строки в stringarr, так как я возвращаю stringarr из метода. – p3ob2lem

Смежные вопросы