Не могу через указатель на двумерный массив вернуть все значения в другой массив - C (СИ)
Формулировка задачи:
void input(int *n); float* input1(int n, int m); int main() { float **a; float **massivA; float *pp; int n, m; int i, j; int nm; //индексатор, чтобы идти от начала до конца массива через указатель nm = 0; input(&n); m = n + 1; printf("\n After input"); printf("\n n=%d m=%d", n, m); a = (float**)malloc(n * sizeof(float*)); for(i=0;i<n;i++) a[i] = (float*)malloc(m * sizeof(float)); pp=input1(n, m); printf("\n pp=%p", pp); //проверил, что адреса одинаковые printf("\n n=%d m=%d", n, m); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { a[i][j] = *(pp+nm); /*записываю в новый массив значения первого идя по указателю с первого элемента до конца массива с помощью индексатора*/ nm++; //индексатор, чтобы идти от начала до конца массива через указатель printf("\n nm=%d", nm); //проверил, что индексы выводятся } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("\n a[%d][%d]=%f", i, j, a[i][j]); /*Не могу через указатель на двумерный массив вернуть все значения в другой массив возвращается только первая строка, либо нули, либо странный длинный адрес*/ } } for (i = 1; i < n; i++) free(a[i]); free(a); _getch(); } void input(int *n) { printf("\nInput counts raws\n"); scanf("%d", n); } float* input1(int n, int m) { int i, j; float *p; float **massivA; printf("\n In input1"); printf("\n n=%d m=%d", n, m); massivA = (float**)malloc(n * sizeof(float*)); for (i = 0; i < n; i++) massivA[i] = (float*)malloc(m * sizeof(float)); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("\n massivA[%d][%d]=", i, j); scanf("%f", &massivA[i][j]); } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("\n massivA[%d][%d]=%f", i, j, massivA[i][j]); //проверил, что массив выводится правильно } } printf("\n&massivA[0][0]=%p", &massivA[0][0]); //проверил, что адреса одинаковые p = &massivA[0][0]; //указатель на первый элемент массива printf("\n p=%p", p); //проверил, что адреса одинаковые return p; }
Решение задачи: «Не могу через указатель на двумерный массив вернуть все значения в другой массив»
#include <stdio.h> #include <conio.h> #include <stdlib.h> void input(int *n); float** input1(int n, int m); int main() { float **a; float **pp; int n, m; int i, j; ... pp=input1(n, m); printf("\n pp=%p", pp); //проверил, что адреса одинаковые printf("\n n=%d m=%d", n, m); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { a[i][j] = **((pp+i)+j); } } void input(int *n) { printf("\nInput counts raws\n"); scanf("%d", n); } float* input1(int n, int m) { int i, j; float **p; float **massivA; ... p = &massivA[0]; for (i = 0; i < n; i++) { *p = &massivA[0][0]; } return p; }
Объяснение кода листинга программы
В этом коде пользователь объявляет двумерный массив a
и динамически выделяет под него память с помощью функции malloc
. Затем он вызывает функцию input
, чтобы ввести количество строк для массива. Функция input
считывает это количество и возвращает его в переменную n
.
Затем пользователь вызывает функцию input1
, чтобы динамически выделить память под двумерный массив pp
с помощью malloc
. Размер этого массива определяется переменными n
и m
.
Функция input1
возвращает указатель на первый элемент массива massivA
, который был выделен с помощью malloc
.
Затем пользователь перебирает все элементы массива a
и инициализирует их значения с помощью формулы a[i][j] = **((pp+i)+j);
. Здесь **((pp+i)+j)
обращается к элементу j
строки i
массива pp
и возвращает его значение.
Обратите внимание, что в данном коде есть некоторые проблемы. Во-первых, функция input1
не освобождает память, которую она выделяет. Это может привести к утечкам памяти. Во-вторых, формула **((pp+i)+j)
может вызвать проблемы с точностью вычислений, поскольку она обращается к элементу массива с использованием смещения от указателя, что может привести к ошибкам, если размер памяти, выделенной под pp
, изменится.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д