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

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

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

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


person SGE    schedule 11.11.2011    source источник


Ответы (5)


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

argv[argc] shall be a null pointer.

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

person Jens Gustedt    schedule 11.11.2011

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

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

person meagar    schedule 11.11.2011
comment
@JensGustedt Прочитайте еще раз, пожалуйста. Я конкретно сказал В общем и ответил в контексте всех массивов, а не конкретно argv. - person meagar; 11.11.2011
comment
@meegar, ну, тогда у твоей второй фразы не так много контекста, на который можно было бы ссылаться. argc существует для удобства (или традиции) и, строго говоря, не является необходимым. - person Jens Gustedt; 12.11.2011
comment
+1 за указание шаблона массива с нулевым (или любым другим) завершением, что делает ненужным носить с собой дескриптор размера. - person alk; 12.11.2011
comment
Этот ответ не соответствует вопросу. OP спрашивает об arg{v,c}, а не обо всех массивах - person Robert Martin; 12.11.2011
comment
@RobertMartin На самом деле, ОП спрашивал о массивах C, в частности, о argv. Мой ответ охватывает оба. Прочтите заголовок вопроса: как определить, что вы достигли конца массива C? (в частности, argv) - person meagar; 12.11.2011
comment
Возможно, ответ следует обновить, чтобы отразить, что, хотя этот ответ в целом правильный, он неверен в текущем контексте. - person Robert Martin; 12.11.2011

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

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

$./foobar hello strawberry

ты получишь

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

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

while (*argv) {
    printf("%s\n", *argv);
    argv++;
}

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

person Robert Martin    schedule 11.11.2011
comment
Вы можете быть правы в том, что это заканчивается комментарием Jens на NULL, но предполагать, что это будет NULL, не зная стандарта, - плохая идея. - person David Winant; 11.11.2011
comment
app.execve.01.02 argv: приложение должно гарантировать, что последний член этого массива является нулевым указателем. - person Robert Martin; 12.11.2011

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

person drdwilcox    schedule 11.11.2011

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

person Pete Wilson    schedule 11.11.2011