В этом контексте тип char**
является указателем на указатель на массив char
s. (Это также может означать указатель на указатель на один char
, но он не используется с _dupenv_s()
).
Функция _dupenv_s()
выделяет массив char
с, запрашивая операционную систему зарезервировать некоторый кусок памяти, достаточно большой для его хранения. Операционная система резервирует часть памяти и дает функции _dupenv_s()
адрес этого вновь выделенного массива char
. Функция _dupenv_s()
сохраняет адрес этого массива в переменной char*
, так как это указатель на массив char
s.
Теперь функция должна передать это значение char*
вызывающей стороне, чтобы вызывающий код мог использовать его. Возвращаемое значение уже используется для возврата кода ошибки, поэтому его нельзя использовать. Но допустим, что у вызывающей стороны есть переменная char*
, готовая принять адрес в выделенном буфере.
Если функция _dupenv_s()
знает, где находится переменная char*
вызывающего, то функция может пойти дальше и заполнить переменную char*
вызывающего абонента правильным значением. Для этого вызывающему необходимо передать адрес переменной char*
вызывающего. То есть вам нужно передать указатель на указатель на массив chars
. Это означает, что char**
должен быть пройден.
Обратите внимание, что это также причина, по которой sizeInBytes
является size_t*
. Вызывающая сторона имеет переменную size_t
, и вызывающая сторона может передать адрес переменной в функцию как size_t*
, чтобы функция могла заполнить переменную правильным значением.
Хотя может быть и верно, что strlen(buffer) == sizeInBytes
, функция strlen()
определяет длину строки путем подсчета количества символов до тех пор, пока она не увидит нулевой терминатор. Время, необходимое для выполнения strlen()
, является линейным по отношению к количеству символов, то есть не является постоянным. Почему бы не пропустить проблему, требующую от вызывающей стороны сделать это и просто указать размер напрямую?
Если указатели все еще смущают вас (и иногда они сбивают с толку), этот ответ о переполнении стека может помочь.