#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++) {
			printf("%d ", array[i]);
		}
		printf("\n");
		array = *++ap;
	}
}

// Правильно и кроссплатформенно.
static void bar(int *first, ...)
{
	va_list ap;
	va_start(ap, first);
	
	int *array = first;
	while (array) {
		printf("array %p: ", (void *)array);
		for (size_t i = 0; i < 4; i++) {
			printf("%d ", array[i]);
		}
		printf("\n");
		array = va_arg(ap, int *);
	}
}

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);
}
