Не могу через указатель на двумерный массив вернуть все значения в другой массив - 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, изменится.