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