Проблема, не обсуждаемая в этой статье, связана с тем, как вы обращаетесь к буферу malloc внутри функции, которая его выделяет, и, по-видимому, сохраняет в ней что-то до того, как она вернет управление своему вызывающему.
В случае, который привел меня на эту страницу, у меня есть функция, которая передает указатель, который получает адрес массива структур HOTKEY_STATE. Прототип объявляет аргумент следующим образом.
HOTKEY_STATE ** plplpHotKeyStates
Возвращаемое значение, ruintNKeys, представляет собой количество элементов в массиве, которое определяется процедурой перед выделением буфера. Однако вместо непосредственного использования malloc () я использовал calloc следующим образом.
*plplpHotKeyStates = ( HOTKEY_STATE * ) calloc ( ruintNKeys ,
sizeof ( HOTKEY_STATE ) ) ;
После того, как я убедился, что plplpHotKeyStates больше не является нулевым, я определил локальную переменную-указатель, hkHotKeyStates, следующим образом.
HOTKEY_STATE * hkHotKeyStates = *plplpHotKeyStates ;
Используя эту переменную с целым числом без знака для нижнего индекса, код заполняет структуры, используя простой оператор-член (.), Как показано ниже.
hkHotKeyStates [ uintCurrKey ].ScanCode = SCANCODE_KEY_ALT ;
Когда массив заполнен полностью, он возвращает ruintNKeys, и у вызывающей стороны есть все, что нужно для обработки массива, либо обычным способом, используя оператор ссылки (->), либо используя тот же метод, который я использовал в функции для получения прямого доступа к массиву.