Ошибка в comp.lang.c FAQ?Вычисление длины строки с переменным форматированием - PullRequest
0 голосов
/ 25 июня 2011

Вопрос 15.4: http://c -faq.com / varargs / varargs1.html

В этом примере кода они, похоже, думают, что va_arg возвращает NULL, если конец спискабыло достигнуто:

    len = strlen(first);

va_start(argp, first);

while((p = va_arg(argp, char *)) != NULL)
    len += strlen(p);

va_end(argp);

Но в документации для va_arg прямо сказано, что это не так, и что va_arg с радостью пройдет через конец списка.Это согласуется с моим опытом, когда я пытался имитировать приведенный выше код и в результате получал segfault.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Они передают нулевой указатель при вызове vstrcat ().

A call to vstrcat looks something like

    char *str = vstrcat("Hello, ", "world!", (char *)NULL);
2 голосов
/ 25 июня 2011

Действительно, va_arg не упоминает о возврате NULL в конце списка.

Если следующего аргумента нет или тип не совместим с типомфактический следующий аргумент (как продвигается в соответствии с продвижением аргумента по умолчанию), произойдут случайные ошибки.

Но в FAQ сказано:

Вызов vstrcat выглядит примерно так:

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

Это означает, что они предполагают, что вызывающий абонент передаст NULL в качестве последнего аргумента , сигнализирующего об окончании списка .

1 голос
/ 25 июня 2011

Обратите внимание, как vstrcat в статье c-faq называется:

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

Последний параметр - NULL. Вот что возвращает va_arg

...