Как создать массив структур для матриц - PullRequest
2 голосов
/ 07 ноября 2019

В основном у меня есть матрицы, и я хочу сохранить их, используя структуру, но мне нужно сделать это с помощью динамического выделения памяти

typedef struct {
    int mymatrix[5][5];  // the matrix 
    int column;          // will hold column number
    int row;             // this one is for row
} mystruct;

, так как я могу превратить это в стиль динамической памяти?

typedef struct {
    int **mymatrix;   // will have the matrix 
    int column;       // will hold column number
    int row;          // this one is for row
} mystruct;

это так? Если да, где я могу указать размер mymatrix? Я также хочу иметь его как массив структур, но я хочу расширить этот массив при создании новых объектов. Любые идеи будут полезны, спасибо, извините, если мой вопрос не ясен.

1 Ответ

2 голосов
/ 07 ноября 2019

Вот демонстрационная программа, которая показывает, как можно выделить память для вашей структуры.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int **mymatrix;      // will have the matrix 
    size_t row;          // this one is for row
    size_t column;       // will hold column number
} mystruct;

int init( mystruct *s, size_t rows, size_t cols )
{
    s->mymatrix = malloc( rows * sizeof( int * ) );

    int success = s->mymatrix != NULL;

    if ( success )
    {
        size_t i = 0;

        while ( i < rows && ( s->mymatrix[i] = calloc( cols, sizeof( int ) ) ) != NULL ) 
        {
            i++;
        }           

        success = i == rows;

        if ( success )
        {
            s->row    = rows;
            s->column = cols;
        }
        else
        {
            for ( size_t j = 0; j < i; j++ )
            {
                free( s->mymatrix[j] );
            }

            free( s->mymatrix );

            s->mymatrix = NULL;
            s->row    = 0;
            s->column = 0;
        }
    }

    return success;
}

void fill( mystruct *s, int value )
{
    for ( size_t i = 0; i < s->row; i++ )
    {
        for ( size_t j = 0; j < s->column; j++ )
        {
            s->mymatrix[i][j] = value;
        }
    }
}

int main(void) 
{
    size_t n = 1;

    mystruct *s = malloc( n * sizeof( mystruct ) );

    if ( init( s, 5, 5 ) ) fill( s, 5 );

    mystruct *tmp = realloc( s, ( n + 1 ) * sizeof( mystruct ) );

    if ( tmp != NULL ) 
    {
        s = tmp,
        init( s + n, 10, 10 );
        fill( s + n, 10 );
        ++n;
    }

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < s[i].row; j++ )
        {
            for ( size_t k = 0; k < s[i].column; k++ )
            {
                printf( "%d ", s[i].mymatrix[j][k] );
            }

            putchar( '\n' );
        }

        putchar( '\n' );
    }

    for ( size_t i = 0; i < n; i++ )
    {
        if ( s[i].mymatrix != NULL )
        {
            for ( size_t j = 0; j < s[i].row; j++ )
            {
                free( s[i].mymatrix[j] );
            }

            free( s[i].mymatrix );
        }
    }

    free( s );

    return 0;
}

Вывод программы:

5 5 5 5 5 
5 5 5 5 5 
5 5 5 5 5 
5 5 5 5 5 
5 5 5 5 5 

10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
...