动态矩阵作为函数的静态参数

时间:2018-04-12 14:12:26

标签: c arrays matrix declaration allocation

基本上,我想创建一个动态矩阵并创建一个以静态形式matrix[rows][cols]接收矩阵的函数。 当函数以*matrix[const]的形式接收矩阵时,事情很有效,但那是“半动态”。

我知道,例如,当我声明int **matrix并分配内存时,我创建一个指向指针数组的指针......当我在静态表单中声明矩阵时函数的标题,然后我没有真正收到数据,但指针地址。  那么,有没有办法创建一个完整的动态矩阵并将其作为一个完整的静态矩阵发送?

2 个答案:

答案 0 :(得分:1)

由于C支持variable-length arrays(我认为你的意思是你使用),你也可以在调用函数时使用它们。首先将维度作为参数传递,然后将它们用于后面的数组或矩阵参数:

void some_function(size_t rows, size_t cols, int matrix[rows][cols])
{
    ...
}

请注意,上面functoin中的matrix实际上是指针。编译器会将参数声明int matrix[rows][cols]视为int (*matrix)[cols]

答案 1 :(得分:1)

如果您的编译器支持可变长度数组,那么您可以将它们用于您的任务。

这是一个示范程序

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

void init( size_t, size_t, int matrix[*][*] );
void display( size_t, size_t, int matrix[*][*] );

void init( size_t rows, size_t cols, int matrix[rows][cols] )
{
    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            matrix[i][j] = i * cols + j;
        }
    }
}

void display( size_t rows, size_t cols, int matrix[rows][cols] )
{
    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            printf( "%3d ", matrix[i][j] );
        }
        putchar( '\n' );
    }
}


int main(void) 
{
    size_t rows, cols;

    printf( "Enter number of rows: " );
    scanf( "%zu", &rows );

    printf( "Enter number of cols: " );
    scanf( "%zu", &cols );

    int ( *matrix )[cols] = malloc( sizeof( int[rows][cols] ) );

    init( rows, cols, matrix );
    display( rows, cols, matrix );

    free( matrix );

    return 0;
}

它的输出可能看起来

Enter number of rows: 3
Enter number of cols: 4
  0   1   2   3 
  4   5   6   7 
  8   9  10  11 

或者没有动态分配,程序可能看起来像

#include <stdio.h>

void init( size_t, size_t, int matrix[*][*] );
void display( size_t, size_t, int matrix[*][*] );

void init( size_t rows, size_t cols, int matrix[rows][cols] )
{
    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            matrix[i][j] = i * cols + j;
        }
    }
}

void display( size_t rows, size_t cols, int matrix[rows][cols] )
{
    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            printf( "%3d ", matrix[i][j] );
        }
        putchar( '\n' );
    }
}


int main(void) 
{
    size_t rows, cols;

    printf( "Enter number of rows: " );
    scanf( "%zu", &rows );

    printf( "Enter number of cols: " );
    scanf( "%zu", &cols );

    int matrix[rows][cols];

    init( rows, cols, matrix );
    display( rows, cols, matrix );

    return 0;
}

程序输出可能如上所示。

否则你确实需要动态分配一个指针的一维数组和一个由指针引用的一维数组。