用malloc/calloc初始化的二维数组

用malloc/calloc初始化的二维数组,c,matrix,malloc,multidimensional-array,C,Matrix,Malloc,Multidimensional Array,好的,我很难理解如何在calloc中使用malloc初始化数组。我试图通过创建一个存储用户输入值的2*3矩阵来进行一些练习。我唯一不想更改的代码部分是使用**矩阵而不是矩阵[5][7]。有什么建议吗 以下是我到目前为止的代码(我不断遇到分段错误): #包括 #包括 main(){ int i,j; int**mat=(int**)malloc(2*3*sizeof(int*); for(i=0;imat是一个双指针。您需要为指针数组分配内存,然后分别为每个指针分配内存 mat[0] = mall

好的,我很难理解如何在calloc中使用malloc初始化数组。我试图通过创建一个存储用户输入值的2*3矩阵来进行一些练习。我唯一不想更改的代码部分是使用**矩阵而不是矩阵[5][7]。有什么建议吗

以下是我到目前为止的代码(我不断遇到分段错误):

#包括
#包括
main(){
int i,j;
int**mat=(int**)malloc(2*3*sizeof(int*);

for(i=0;i
mat
是一个双指针。您需要为指针数组分配内存,然后分别为每个指针分配内存

mat[0] = malloc(sizeof(int) *n ); /* n = Number of elements */
mat[0]
在写入之前应该分配一些内存

那么您的
scanf()
mat[i][j]
中就有意义了。
无需强制转换malloc()

我希望我的答案在任何情况下都对您有用

如果您使用的编译器支持C99,那么您至少可以使用以下两种方法

在第一种情况下,您可以立即分配一个二维数组。 在第二种情况下(即您在文章中描述的情况),您可以分配两个一维数组来模拟一个二维数组

下面是一个演示这两种方法的程序

另外,不要忘记释放已分配的数组。请考虑在每种情况下如何释放数组

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

int main( void )
{
    {
        size_t N = 2;
        size_t M = 3;

        int ( *mat )[M] = malloc( N * M * sizeof( int ) );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "Input a value for Array[%d][%d]: ", i, j );
                scanf( "%d", &mat[i][j] );
            }
        }

        printf( "\n" );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "%2d ", mat[i][j] );
            }

            printf( "\n" );
        }

        free( mat );
    }

    {
        size_t N = 2;
        size_t M = 3;

        int **mat = malloc( N * sizeof( int * ) );

        for ( size_t i = 0; i < N; i++ )
        {
            mat[i] = malloc( M * sizeof( M ) );
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "Input a value for Array[%d][%d]: ", i, j );
                scanf( "%d", &mat[i][j] );
            }
        }

        printf( "\n" );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "%2d ", mat[i][j] );
            }

            printf( "\n" );
        }

        for ( size_t i = 0; i < N; i++ ) free( mat[i] );
        free( mat );
    }

    return 0;
}
如果要输入这些值


您可以在www.ideone.com上测试该程序,选择语言
strict C99

不要使用隐式
int
返回类型。此外,您的代码看起来不错now@Laura肯特:看看我的答案。它会对你有用。:)看“相关”,有数百个线程用于对二维数组进行malloc。该程序的编辑版本仍有一个问题。行“int main(void)”将导致编译器(启用所有警告)抱怨。该行应为:“int main()“@Laura Kent对于这个答案,您可以在第一个循环中完成。谢谢您,但我仍然有点困惑如何执行您的建议。我应该使用循环为每个指针分配内存吗?这一行:int main(void)无效。而是使用:int main()@user3629249您完全错了,不知道C。C 2011函数main之前的@user3629249应声明为具有参数void。至于我的帖子,我展示了用C89编写的程序,因为即使不是所有现代编译器都支持C99。例如,到目前为止MS VS不支持C99。因此,在我的帖子correspon中声明mainds到C89,C99标准。@user3629249这是我的示例,它是使用www.ideone.com并选择语言C99 strict编写的。
mat[0] = malloc(sizeof(int) *n ); /* n = Number of elements */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    {
        size_t N = 2;
        size_t M = 3;

        int ( *mat )[M] = malloc( N * M * sizeof( int ) );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "Input a value for Array[%d][%d]: ", i, j );
                scanf( "%d", &mat[i][j] );
            }
        }

        printf( "\n" );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "%2d ", mat[i][j] );
            }

            printf( "\n" );
        }

        free( mat );
    }

    {
        size_t N = 2;
        size_t M = 3;

        int **mat = malloc( N * sizeof( int * ) );

        for ( size_t i = 0; i < N; i++ )
        {
            mat[i] = malloc( M * sizeof( M ) );
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "Input a value for Array[%d][%d]: ", i, j );
                scanf( "%d", &mat[i][j] );
            }
        }

        printf( "\n" );

        for ( size_t i = 0; i < N; i++ )
        {
            for ( size_t j = 0; j < M; j++ )
            {
                printf( "%2d ", mat[i][j] );
            }

            printf( "\n" );
        }

        for ( size_t i = 0; i < N; i++ ) free( mat[i] );
        free( mat );
    }

    return 0;
}
1  2  3 
4  5  6