fork download
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3.  
  4. // Вручную и с undefined behavior.
  5. static void foo(int *first, ...)
  6. {
  7. int **ap = &first;
  8. int *array = first;
  9. while (array) {
  10. printf("array %p: ", (void *)array);
  11. for (size_t i = 0; i < 4; i++) {
  12. printf("%d ", array[i]);
  13. }
  14. printf("\n");
  15. array = *++ap;
  16. }
  17. }
  18.  
  19. // Правильно и кроссплатформенно.
  20. static void bar(int *first, ...)
  21. {
  22. va_list ap;
  23. va_start(ap, first);
  24.  
  25. int *array = first;
  26. while (array) {
  27. printf("array %p: ", (void *)array);
  28. for (size_t i = 0; i < 4; i++) {
  29. printf("%d ", array[i]);
  30. }
  31. printf("\n");
  32. array = va_arg(ap, int *);
  33. }
  34. }
  35.  
  36. int main(void)
  37. {
  38. int a[] = {1, 2, 3, 4};
  39. int b[] = {5, 6, 7, 8};
  40.  
  41. // Нужен способ узнать количество аргументов, которые были переданы
  42. // в (...). Например, printf определяет это по количеству %-спецификаторов
  43. // в форматной строке. Можно передавать количество в одном из фиксированных
  44. // аргументов. А можно просто обозначать последний аргумент какой-нибудь
  45. // меткой, у нас это NULL.
  46.  
  47. foo(a, b, NULL);
  48. bar(a, b, NULL);
  49. }
  50.  
Runtime error #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
Standard output is empty