Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 05.02.2022
Сообщений: 2

Как корректно передать матрицу в функцию через указатель?

05.02.2022, 17:48. Показов 974. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте. Мне нужно написать программу на языке си, которая получает с клавиатуры от пользователя двумерный массив. Пользователь задаёт размеры и заполняет элементы. Затем некая функция производит с ним какие-то действия и результат выводится на экран. При этом всём требуются отдельные функции для ввода, вычисления и вывода. Программа работает в консоли. Ввод и вывод, если больше не писать функций, произвести получается, но после появляется ошибка ./bus error, обращение к несуществующей памяти, как я понимаю. Пытаюсь сделать функцию с циклом по подобию вывода, она делает чёрти что. Мне кажется, я путаюсь в указателях. Вот мой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 // Copyright kyleerod 2022
#include <stdio.h>
#include <stdlib.h>
void input(int ***matrix, int *n, int *m);
void output(int ***matrix, int n, int m);
 
 
void main() {
    int **matrix, **result;
    int n, m;
 
    input(&matrix, &n, &m);
    output(&matrix, n, m);
}
 
void input(int ***matrix, int *n, int *m) {
    int i, j;
    scanf("%d", n);
     scanf("%d", n);
    *matrix = (int**)malloc((*n)*sizeof(int*));
    for (i = 0; i < *m; i++)
    matrix[i] = (int**)malloc((*m) * sizeof(int));
    for ( i = 0; i < *n; ++i )
        for ( j = 0; j < *m; ++j )
            scanf("%d", &matrix[ i ][ j ]);
}
void output(int ***matrix, int n, int m) {
    int i, j;
    for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++)
    printf("%d ", matrix[i][j]);
    printf("\n");
    }
}
Пожалуйста, помогите разобраться что не так и разъясните про двойные и тройные указатели.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2022, 17:48
Ответы с готовыми решениями:

Как передать указатель на конкретную функцию через указатель?
Здравствуйте, подскажите пожалуйста. Напишите функцию, строящую график заданной функции на заданном интервале изменения ...

Как в функцию передать указатель на матрицу?
Че то я немного туплю, давно с функциями не работал, мне нужно реализовать функцию которая бы работала и изменяла элементы матрицы...

Как передать указатель на функцию через метод класса ?
typedef void (*FuncCallback)(float* flValue); Пробовал по всякому и ни как: Class.CallFunc // error C3867: CClass::CallFunc :...

2
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,139
05.02.2022, 18:21
Soffjpri, попробуй

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
 
void input(int ***matrix, size_t *n, size_t *m)
{
    scanf("%zu", n);
    scanf("%zu", m);
 
    *matrix = malloc((*n)*sizeof(**matrix));
    for (size_t i = 0; i < *n; i++)
    {
        (*matrix)[i] = malloc((*m) * sizeof(*matrix));
    }
    
    for (size_t  i = 0; i < *n; ++i )
    {
        for (size_t  j = 0; j < *m; ++j )
        {
            scanf("%d", &(*matrix)[ i ][ j ]);
            //(*matrix)[ i ][ j ]=rand();
        }
    }
}
 
void output(int **matrix, size_t n, size_t m)
{
    for (size_t i = 0; i < n; i++)
    {
        for (size_t j = 0; j < m; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
 
int main()
{
    int **matrix;
    size_t n, m;
 
    input(&matrix, &n, &m);
    output(matrix, n, m);
}
0
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,325
06.03.2022, 00:24
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <stdlib.h>
 
int ** create_array (size_t, size_t);
void free_2d_arr (int **);
int input_array (int **, size_t, size_t);
void printf_array (int **, size_t, size_t);
int cmp (const void *, const void *);
 
int main (void) {
    size_t rows, cols;                      // запрашиваем размеры массива
    if ((printf("rows?: ") && scanf("%zu", &rows) != 1) || rows < 1)
        return 1;                           // если ошибка ввода, выходим с кодом ошибки
    if ((printf("cols?: ") && scanf("%zu", &cols) != 1) || cols < 1)
        return 1;
 
    int ** a = create_array(rows, cols);    // запрашиваем память под массив
    if (a == NULL)                          // если память не дали, выходим
        return 2;                           // с кодом ошибки
 
    if (input_array(a, rows, cols) == 1) {  // запрашиваем элементы массива,
        free_2d_arr(a);                     // если возникла ошибка ввода,
        return 1;                           // освобождаем память и выходим
    }
 
    /* производим какие-то действия с массивом */
    printf_array(a, rows, cols);            // выводим массив на экран
    qsort(a[0], rows*cols, sizeof(int), cmp);   // сортируем по возрастанию
    printf_array(a, rows, cols);            // выводим массив на экран
 
    /* конец программы */
    free_2d_arr(a);                         // освобождаем память
    return 0;                               // конец программы
}
// -------------------------------------------------------------
int ** create_array (size_t rows, size_t cols) {
    int ** temp = (int **) calloc(rows, sizeof(int *));
    if (temp == NULL)
        return NULL;
    temp[0] = (int *) calloc(rows*cols, sizeof(int));
    if (temp[0] == NULL) {
        free(temp);
        return NULL;
    }
    for (size_t i = 1; i < rows; i++)
        temp[i] = temp[i-1] + cols;
    return temp;
}
// -------------------------------------------------------------
void free_2d_arr  (int ** array) {
    free(array[0]);
    free(array);
}
// -------------------------------------------------------------
int input_array (int ** a, size_t rows, size_t cols) {
    for (size_t i = puts("") && 0; i < rows; i++)
        for (size_t k = 0; k < cols; k++) {
            printf("a[%zu][%zu] = ", i+1, k+1);
            if (scanf("%d", &a[i][k]) != 1)
                return 1;
        }
    return 0;
}
// -------------------------------------------------------------
void printf_array (int ** a, size_t rows, size_t cols) {
    for (size_t i = puts("") && 0; i < rows; i++, puts(""))
        for (size_t k = 0; k < cols; k++)
            printf("% 4d", a[i][k]);
}
// -------------------------------------------------------------
int cmp (const void * a, const void * b) {
    return *(int *)a - *(int *)b;
}
// -------------------------------------------------------------
пример запуска и тест на утечки памяти:

$ valgrind ./program
==396662== Memcheck, a memory error detector
==396662== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==396662== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==396662== Command: ./program
==396662==
rows?: 2
cols?: 3

a[1][1] = 1
a[1][2] = 2
a[1][3] = 3
a[2][1] = 3
a[2][2] = 2
a[2][3] = 1

1 2 3
3 2 1

1 1 2
2 3 3
==396662==
==396662== HEAP SUMMARY:
==396662== in use at exit: 0 bytes in 0 blocks
==396662== total heap usage: 4 allocs, 4 frees, 2,088 bytes allocated
==396662==
==396662== All heap blocks were freed -- no leaks are possible
==396662==
==396662== For lists of detected and suppressed errors, rerun with: -s
==396662== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2022, 00:24
Помогаю со студенческими работами здесь

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Не могу разобраться как передать корректно передать массив из функции в функцию
//--------------------------------------------------------------------------- #pragma hdrstop ...

написать функцию которая выводит матрицу и передать в качестве параметра указатель на массив
Помогите найти ошибку.. Нужно написать функцию которая выводит матрицу и передать в качестве параметра указатель на массив #include...

Как передать указатель на структуру так, чтобы потом иметь возможность корректно удалить его?
Есть класс в котором содержится указание на некоторую структуру данных. Этот указатель передается в другие классы. Однако, я делаю это...

Указатель на функцию (как передать?)
void abc(int a, int b) { } void func(void *f(int, int)) { f; }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru