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

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

05.02.2022, 17:51. Показов 863. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте. Мне нужно написать программу на языке си, которая получает с клавиатуры от пользователя двумерный массив. Пользователь задаёт размеры и заполняет элементы. Затем некая функция производит с ним какие-то действия и результат выводится на экран. При этом всём требуются отдельные функции для ввода, вычисления и вывода. Программа работает в консоли. Ввод и вывод, если больше не писать функций, произвести получается, но после появляется ошибка ./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
 
#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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2022, 17:51
Ответы с готовыми решениями:

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

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

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

1
7 / 6 / 1
Регистрация: 26.12.2019
Сообщений: 75
02.04.2022, 23:51
Доброго времени суток !

У вас не хватает понимания в методах адресации.

Code
1
unsigned int data;
выделена ячейки памяти которые обозначены словом data (фактически data эквивалент содержимому этих ячеек)

Code
1
unsigned int *data;
выделены ячейки памяти где хранится адрес и обозначен этот адрес (не данные) словом data

Code
1
unsigned int **data;
выделены ячейки памяти где лежит адрес адреса и обозначен этот адрес адреса словом data

Таким образом в первом случае если вы производите операции с data то вы работаете непосредственно с данными,
Во втором случае сложение, вычитание, автоинкремент, автодекремент будут производится с адресом, тоесть data++ увеличит адресс на 4 байта (32бит) или 8 байт(64бит) или если тип был char на 1 байт.
В третьем же случае в не заисимости от типа при арифметических операциях адрес будет именяться всегда на размер адреса - 4 байта (32бит) или 8 байт (64бит)

Теперь перейдем к вашему вопросу.
Вы хотите создавать произвольный двумерный массив и передавать его в функцию. В Си впринципе нет многомерных массивов (в памяти), когда вы декларируете
Code
1
int matrix[10][10];
компилятор выделит 100 ячеек памяти типа int. Когда вы обратитесь matrix[1][2] то он просто умножет колличество элементов в строке на 1 и прибавит 2 и выдаст содержимое. Тоесть объявление
Code
1
int matrix[10][10];
носит декларативный характер. В вашем же случае количество строк и столбцов произвольно и формируется в процессе исполнения программы (тоесть не декларируется) таким образом вы к памяти должны всегда обращаться как к одномерному массиву.
Code
1
2
3
4
5
6
int *matrix;
 
 matrix = malloc(n * m * sizeof(int));
 ...
 
 printf("%d ", matrix[(i * m) + j]);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2022, 23:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru