#include <stdio.h>
#include <stdarg.h>
// Вручную и с undefined behavior.
static void foo(int *first, ...)
{
int **ap = &first;
int *array = first;
while (array) {
printf("array %p: ", (void *)array
); for (size_t i = 0; i < 4; i++) {
}
array = *++ap;
}
}
// Правильно и кроссплатформенно.
static void bar(int *first, ...)
{
va_list ap;
int *array = first;
while (array) {
printf("array %p: ", (void *)array
); for (size_t i = 0; i < 4; i++) {
}
}
}
int main(void)
{
int a[] = {1, 2, 3, 4};
int b[] = {5, 6, 7, 8};
// Нужен способ узнать количество аргументов, которые были переданы
// в (...). Например, printf определяет это по количеству %-спецификаторов
// в форматной строке. Можно передавать количество в одном из фиксированных
// аргументов. А можно просто обозначать последний аргумент какой-нибудь
// меткой, у нас это NULL.
foo(a, b, NULL);
bar(a, b, NULL);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KCi8vINCS0YDRg9GH0L3Rg9GOINC4INGBIHVuZGVmaW5lZCBiZWhhdmlvci4Kc3RhdGljIHZvaWQgZm9vKGludCAqZmlyc3QsIC4uLikKewoJaW50ICoqYXAgPSAmZmlyc3Q7CglpbnQgKmFycmF5ID0gZmlyc3Q7Cgl3aGlsZSAoYXJyYXkpIHsKCQlwcmludGYoImFycmF5ICVwOiAiLCAodm9pZCAqKWFycmF5KTsKCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykgewoJCQlwcmludGYoIiVkICIsIGFycmF5W2ldKTsKCQl9CgkJcHJpbnRmKCJcbiIpOwoJCWFycmF5ID0gKisrYXA7Cgl9Cn0KCi8vINCf0YDQsNCy0LjQu9GM0L3QviDQuCDQutGA0L7RgdGB0L/Qu9Cw0YLRhNC+0YDQvNC10L3QvdC+LgpzdGF0aWMgdm9pZCBiYXIoaW50ICpmaXJzdCwgLi4uKQp7Cgl2YV9saXN0IGFwOwoJdmFfc3RhcnQoYXAsIGZpcnN0KTsKCQoJaW50ICphcnJheSA9IGZpcnN0OwoJd2hpbGUgKGFycmF5KSB7CgkJcHJpbnRmKCJhcnJheSAlcDogIiwgKHZvaWQgKilhcnJheSk7CgkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKCQkJcHJpbnRmKCIlZCAiLCBhcnJheVtpXSk7CgkJfQoJCXByaW50ZigiXG4iKTsKCQlhcnJheSA9IHZhX2FyZyhhcCwgaW50ICopOwoJfQp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgYVtdID0gezEsIDIsIDMsIDR9OwogICAgaW50IGJbXSA9IHs1LCA2LCA3LCA4fTsKICAgIAogICAgLy8g0J3Rg9C20LXQvSDRgdC/0L7RgdC+0LEg0YPQt9C90LDRgtGMINC60L7Qu9C40YfQtdGB0YLQstC+INCw0YDQs9GD0LzQtdC90YLQvtCyLCDQutC+0YLQvtGA0YvQtSDQsdGL0LvQuCDQv9C10YDQtdC00LDQvdGLCiAgICAvLyDQsiAoLi4uKS4g0J3QsNC/0YDQuNC80LXRgCwgcHJpbnRmINC+0L/RgNC10LTQtdC70Y/QtdGCINGN0YLQviDQv9C+INC60L7Qu9C40YfQtdGB0YLQstGDICUt0YHQv9C10YbQuNGE0LjQutCw0YLQvtGA0L7QsgogICAgLy8g0LIg0YTQvtGA0LzQsNGC0L3QvtC5INGB0YLRgNC+0LrQtS4g0JzQvtC20L3QviDQv9C10YDQtdC00LDQstCw0YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQviDQsiDQvtC00L3QvtC8INC40Lcg0YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0YUKICAgIC8vINCw0YDQs9GD0LzQtdC90YLQvtCyLiDQkCDQvNC+0LbQvdC+INC/0YDQvtGB0YLQviDQvtCx0L7Qt9C90LDRh9Cw0YLRjCDQv9C+0YHQu9C10LTQvdC40Lkg0LDRgNCz0YPQvNC10L3RgiDQutCw0LrQvtC5LdC90LjQsdGD0LTRjAogICAgLy8g0LzQtdGC0LrQvtC5LCDRgyDQvdCw0YEg0Y3RgtC+IE5VTEwuCiAgICAKICAgIGZvbyhhLCBiLCBOVUxMKTsKICAgIGJhcihhLCBiLCBOVUxMKTsKfQo=