Итак, я работаю над утилитой командной строки на базе Linux, которая должна принимать несколько флагов, и я заметил интересное поведение. Я буду публиковать тестовый код, который я использовал вне основной утилиты. Я использовал этот код, поэтому мне не нужно было изменять фактическую утилиту, пока у меня не был рабочий код, который я мог просто вставить. Итак, вот код, с которым я возился:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
while(--argc && (*++argv)[0] == '-')
putchar('*');
printf("\n%s\n", argv[0]);
}
Пожалуйста, не обращайте внимания на тот факт, что все, что делает эта программа, это печатает звездочку и печатает собственное имя при вызове с одним аргументом -b. Печать звездочки была просто для того, чтобы показать, что цикл выполнялся один раз. Итак, я запускаю это в терминале как «./test -n», и я ожидал, что результат будет таким:
*./контрольная работа
К моему большому удивлению, вывод был таким:
*-b
У меня есть рабочая теория того, что делает оператор (*++argv)[0]
, но я все еще немного туманен. Я предполагаю, что он проходит через массив указателей, просматривая первый символ в каждой строке, на которую указывает, (*++argv)[0]
теперь разыменовывает *argv[0]
или нулевой элемент первой строки аргумента.
Итак, в основном у меня есть три вопроса:
- Что именно делает это заявление?
- Почему я не могу вернуться к argv[0] или argv[0][0], как бы я ни пытался?
- Сохраняет ли значение по адресу, указанному argv[0], в другом char *, это единственный способ, которым я смог получить доступ к этому значению на данный момент, обычный способ обойти это?
Я действительно смущен этим в данный момент и пробовал все, что я мог придумать, чтобы решить эту проблему. В какой-то момент у меня был цикл, который печатал алфавит, я не знаю, к какой части памяти обращалась программа. Самой интересной перестановкой было подтягивание откуда-то переменных sshid.
Заранее всем спасибо за помощь в этом.