Передача двумерного динамического массива в функцию через указатель - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет! Собственно сабж. Я почитал о том, как это делать, но слишком много случаев показано именно для c++ и без вывода этого массива на экран. (т.к. я новичок, извините если пример именно такого типа уже разжёвывали) Программа должна создавать двумерный массив заданной размерности и в дальнейшем принять от пользователя значения для каждой ячейки. Потом должна происходить передача двумерного массива в функцию с помощью указателя и выводить на экран вбитые значения массива. Я сделал так:
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. int f1(int **b,int x,int y,int i, int j)
  4. {
  5. for (i=0;i<x;i++)
  6. {
  7. for (j=0;j<y;j++)
  8. {
  9. printf("a[%d][%d]=%d\n",i,j,**b);
  10. }
  11. }
  12. return(0);
  13. }
  14. int main()
  15. {
  16. int i,j,k,x,y,n1,*b;
  17. printf ("strok\n");
  18. scanf ("%d",&y);
  19. printf ("stolbcov\n");
  20. scanf ("%d",&x);
  21. int a[x][y];
  22. for (i=0;i<x;i++)
  23. {
  24. for (j=0;j<y;j++)
  25. {
  26. printf("vvedite chislo a[%d][%d]\n",i,j);
  27. scanf("%d",&a[i][j]);
  28. }
  29. }
  30. b=&a[0][0];
  31. n1=f1(*b,x,y,0,0);
  32. }
Но программа вылетает с ошибкой после задания значений ячеек массива. Для меня очевидно, что я где-то ошибся, но не знаю где. Помогите пожалуйста)

Решение задачи: «Передача двумерного динамического массива в функцию через указатель»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. int f1(int *b, int x, int y)
  4. {
  5.     int i, j;
  6.     for (i = 0; i < x; ++i){
  7.         for (j = 0; j < y; ++j)
  8.             printf("%6d", *(b + i * y + j));
  9.         printf("\n");
  10.     }
  11.     return(0);
  12. }
  13.  
  14. int main()
  15. {
  16.     int i , j, x, y, *b;
  17.     printf ("strok\n");
  18.     scanf ("%d",&y);
  19.     printf ("stolbcov\n");
  20.     scanf ("%d", &x);
  21.     int a[x][y];
  22.     for (i = 0; i < x; i++){
  23.         for (j = 0; j < y; j++){
  24.             printf("vvedite chislo a[%d][%d]\n",i,j);
  25.             scanf("%d",&a[i][j]);
  26.         }
  27.     }
  28.     b = &a[0][0];
  29.     f1(b,x,y);
  30. }

Объяснение кода листинга программы

  1. Объявление функции f1, которая принимает три аргумента: указатель b на массив, целые числа x и y.
  2. Внутри функции f1 объявление двух переменных i и j, которые будут использоваться в циклах.
  3. Инициализация значений переменных i и j в начале циклов.
  4. Два вложенных цикла, которые будут выполняться столько раз, сколько указано в аргументах x и y.
  5. Внутри вложенных циклов происходит вывод значения элемента массива, на который указывает аргумент b + i * y + j, с форматированием в шестом формате.
  6. После окончания вложенных циклов выполняется перевод строки.
  7. В конце функции f1 возвращается значение 0, что означает успешное выполнение.
  8. В функции main объявление пяти переменных: i, j, x, y и указатель b.
  9. С помощью функции scanf пользователю предлагается ввести значение для переменной y, а затем для переменной x.
  10. Создание двумерного массива a с помощью цикла for, в котором пользователь вводит значения для каждого элемента массива.
  11. Инициализация указателя b с адресом первого элемента массива a.
  12. Вызов функции f1 с передачей аргументов b, x и y.
  13. Конец функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы