как определить, когда вы достигли конца массива C? (в частности, argv)

#c #argv #argc

#c #argv #argc

Вопрос:

был задан вопрос по этому поводу, в основном, связанный с argc…фактически не имея argc

если заданный вами argv, который, как я понимаю, по сути, представляет собой массив указателей на соответствующие массивы символов каждого введенного аргумента,

как бы я на самом деле подсчитал количество указателей в argv?

Ответ №1:

Стандарт C определяет:

 argv[argc] shall be a null pointer.
  

Таким образом, вы всегда можете определить конец путем тестирования на 0 .

Ответ №2:

В общем, вы не можете, если массив специально не заканчивается некоторым значением «stop», таким как 0 или NULL . Это причина argc существования. Сами указатели не имеют длину / количество / количество элементов, связанных с ними.

При передаче указателей на массивы вы обязательно должны также указать количество элементов или явно выделить слишком много элементов и добавить элемент «null» в конец массива.

Комментарии:

1. @JensGustedt Прочтите еще раз, пожалуйста. Я конкретно сказал «В целом» и ответил в контексте всех массивов , а не конкретно argv .

2. @meegar, ну, что ж, тогда ваша вторая фраза не имеет особого контекста для ссылки. argc существует для удобства (или традиции) и, строго говоря, не является необходимым.

3. 1 за указание шаблона массива с нулевым (или любым другим) завершением, что делает ненужным перенос дескриптора размера с ним.

4. Этот ответ не соответствует вопросу. OP запрашивает arg{v, c}, а не «все массивы»

5. @RobertMartin На самом деле, OP спрашивал о «массивах C» конкретно argv. Мой ответ охватывает оба. Прочитайте заголовок вопроса: «как определить, когда вы достигли конца массива C? (в частности, argv)»

Ответ №3:

Я не согласен с некоторыми людьми здесь.

сам argv завершается нулем. Например, если вы введете

 $./foobar hello strawberry
  

вы получите

 argv = [%p]  [%p]  [%p]  [NULL]
        |     |     |    
        |     |      _"strawberry"
        |     | 
        |      _"hello"
        |    
         _"./foobar"
  

Другими словами, такой код будет работать:

 while (*argv) {
    printf("%sn", *argv);
    argv  ;
}
  

Попробуйте и убедитесь!

Комментарии:

1. Возможно, вы правы в том, что он заканчивается на NULL в комментарии Jens, но предполагать, что это будет NULL, не зная стандарта, — плохая идея.

2. app.execve.01.02 «argv: приложение должно убедиться, что последний элемент этого массива является нулевым указателем».

Ответ №4:

Вы не можете. После того, как массив заканчивается, возникает случайность, и вы не можете точно отличить случайность от реальных данных.

Ответ №5:

Вы должны использовать argc, который всегда присутствует при предоставлении argv. Последний указатель на символ в argv находится в argv[argc-1]