Цитата:
Сообщение от Hubbitus
Борланд, не уверен что память под argv выделяется до запуска программы... Не в CRT это разве должно делаться?
|
Вот как все происходит. Точка входа в любое приложение - библиотечная функция mainCRTStartup() - она считывает указатель на командную строку запускаемого приложения, выполняет всю необходимую инициализацию, формирует переменные argc и argv, а затем вызывает нашу функцию main(). Откуда взялась эта память - была ли она выделена в функции создании процесса или выделена из "кучи" процесса - мы не знаем и знать не должны.
В любом случае, функцию realloc можно вызывать только, если по заданному указателю уже была выделена память с помощью malloc/realloc - и никак иначе. А доступ на запись в переменные argc м argv просто-напросто может быть блокирован самой библиотекой CRT - хотя бы для того, чтобы пользователь не мог ничего испортить внутри самой библиотеки CRT.
Цитата:
Сообщение от Hubbitus
я копирую этот массив (не перераспределяю текущий), манипулирую с копией, а потом, просто изменяю указатель argv чтобы он указывал в новое место. Это-то изменение указателя будет легитимно?
|
Опять же, смотря в каком контексте - если внутри программы есть код, который обрабатывает командную строчку (читая из argc и argv) - то подмена указателей проходит. Даже если, что-то опять пойдет не так - например, при завершении программы - можно просто сохранить старое значение указателя и восстановить перед выходом.