Указатель указателя c ++ char инициализация - PullRequest
3 голосов
/ 10 сентября 2010

Я с сомнением В инициализации этого в C ++:

char** A_Function()
{
    char** charList = new char*[2];
    charList[0] = "abcde";
    charList[1] = "fghij";
    return charList;
}

Нет проблем "при компиляции этого кода", но я не уверен в поведении.

1 - список символов: char * в куче, хорошо?2 - charList [n_position] находится в куче или в стеке?

Я не понимаю, что на самом деле означает char * [2], значит ли это: Это статический массив, на каждом элементе которого есть указательto char?

Если он статический, этот массив будет размещен в стеке, поэтому этот массив является источником огромных ошибок?

Если я прав, как разместить его в куче?

Ответы [ 3 ]

6 голосов
/ 10 сентября 2010

Может быть, поможет картинка:

alt text

Когда вы возвращаетесь из A_Function, charList уничтожается, но два других остаются нетронутыми. Поскольку вы возвращаете значение charList из A_Function, проблем нет - вы просто поместите это же значение в другую переменную, по крайней мере, предполагая, что вы действительно используете возвращаемое значение из A_Function ( то есть присвоить его чему-либо).

Если вы не сохраните это значение, у вас будет утечка памяти - у вас больше не будет указателя на массив из двух указателей, которые вы разместили в бесплатном хранилище, поэтому вы не сможете их освободить .

5 голосов
/ 10 сентября 2010

Массив из 2 указателей типа char * размещается в динамической памяти (куче).Каждый элемент массива должен указывать на строку (строковый литерал), хранящуюся в статической памяти.Статическая память не является ни кучей, ни стеком.Объекты в статической памяти живут до тех пор, пока работает программа.Итак, формально, в вашем коде нет проблем.

Однако не стоит указывать на строковые литералы с указателями char *.Строковые литералы не модифицируются, поэтому в этом случае было бы гораздо лучше использовать указатели const char *.

1 голос
/ 10 сентября 2010

Вы можете посмотреть на каждую из отдельных частей new char*[2], чтобы понять, что она делает:

new          dynamically allocate
new      [ ] an array
new      [2] of two
new char*[2] pointers to "char" objects

Итак, она динамически выделяет массив из двух указателей для char с.Он возвращает указатель на начальный элемент выделенного массива (это то, что всегда возвращает форма массива new).Этот указатель хранится в charList.charList находится в стеке (имеет автоматическую продолжительность хранения) и указывает на динамически размещенный массив, который находится в куче.

Два указателя в динамически распределенном массиве, charList[0] и charList[1], устанавливаются так, чтобы указывать на строковые литералы, "abcde" и "fghij", соответственно.Строковые литералы имеют статическую длительность хранения, поэтому они существуют в течение всего времени работы вашей программы.

...