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

Решение задачи: «Не могу через указатель на двумерный массив вернуть все значения в другой массив»

textual
Листинг программы
#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, изменится.

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


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

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

5   голосов , оценка 4.4 из 5
Похожие ответы