使用函数在C中创建和释放二维数组

使用函数在C中创建和释放二维数组,c,arrays,C,Arrays,我参考下面的URL练习2D动态数组: 我的代码: #include <stdio.h> #include <stdlib.h> int** create_2d_arr(int row_size,int colum_size) { int** array = (int**)malloc(sizeof(int*)*row_size); for (int i = 0; i < row_size; i++) array[i] = (int

我参考下面的URL练习2D动态数组:

我的代码:

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

int** create_2d_arr(int row_size,int colum_size)
{
    int** array = (int**)malloc(sizeof(int*)*row_size);
    for (int i = 0; i < row_size; i++)
        array[i] = (int*)malloc(sizeof(int)*colum_size);  
    return array;
}

void free_2d_arr(int** matrix,int row_size, int colum_size) {
    for (int i = 0; i < row_size; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

int main(int argc, char const *argv[])
{
    int row=3,cloum=2;
    int** arr_2d = create_2d_arr(row,cloum);

    arr_2d[0,0]=4;
    arr_2d[0,1]=5;

    arr_2d[1,0]=6;
    arr_2d[1,1]=7;

    arr_2d[2,0]=8;
    arr_2d[2,1]=9;

    for(int i=0;i<row;i++)
    for(int j=0;j<cloum;j++)
    printf("arr_2d[%d,%d] = %d \n",i,j,arr_2d[i,j]);

    free_2d_arr(arr_2d,row,cloum);

    return 0;
}
只有arr_2d[2,0]=8 arr_2d[2,1]=9是正确的。 我不明白我的代码哪里错了。 有人帮我吗


更新 谢谢你的回复。 但是在我将
arr_2d[2,0]=8
修改为
rr_2d[2][0]=8
之后

result of printf is
arr_2d[0][0] = -267545984
arr_2d[0][1] = -267545952
arr_2d[1][0] = -267545984
... 编译器警告 我的编译器是铿锵的,即使我使用gcc

=========

解决了的 修改后:

printf("arr_2d[%d,%d] = %d \n",i,j,arr_2d[i,j]);
=>

它工作正常。
非常感谢大家。

您不能像这样访问数组的值

arr_2d[x,y];
您必须使用这种类型的语法

arr_2d[x][y];

您不能像这样访问数组的值

arr_2d[x,y];
您必须使用这种类型的语法

arr_2d[x][y];

arr\u2d[x,y]
相当于
arr\u2d[y]

在分配和访问中使用
arr\u 2d[x][y]

在C(或C++)中,先计算a,然后计算b。。然后选择z并返回z的值


因此:


arr\u2d[x,y]
相当于
arr\u2d[y]

在分配和访问中使用
arr\u 2d[x][y]

在C(或C++)中,先计算a,然后计算b。。然后选择z并返回z的值


因此:

正确的语法是

arr_2d[i][j] = n;
我从来没有见过类似于
arr_2d[I,j]
的东西,如果有人给我们解释一下,那就太棒了

我猜这相当于
arr_2d[j]
,但我不确定

编辑:精度:您应该将所有的
arr\u 2d[i,j]
(如
arr\u 2d[0,0]
)更改为新语法

arr_2d[i][j] = n;
我从来没有见过类似于
arr_2d[I,j]
的东西,如果有人给我们解释一下,那就太棒了

我猜这相当于
arr_2d[j]
,但我不确定


编辑:精度:您应该将所有的
arr\u 2d[i,j]
(如
arr\u 2d[0,0]
)更改为新语法

以下建议的代码:

#include <stdio.h>
#include <stdlib.h>   // exit(), EXIT_FAILURE


// prototypes
void free_2d_arr( int** matrix, size_t row_size, size_t colum_size );


int** create_2d_arr( size_t row_size, size_t colum_size )
{
    int** array = calloc( row_size, sizeof( int* ) );
    if( !array )
    {
        perror( "malloc failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    for ( size_t i = 0; i < row_size; i++ )
    {
        array[ i ] = malloc( sizeof(int) * colum_size );  
        if( !array[ i ] )
        {
            perror( "malloc failed" );
            free_2d_arr( array, row_size, colum_size ); 
            exit( EXIT_FAILURE );
        }
    }
    return array;
}


void free_2d_arr( int** matrix, size_t row_size, size_t colum_size ) 
{
    (void)colum_size;
    for ( size_t i = 0; i < row_size; i++ ) 
    {
        free( matrix[ i ] );
    }
    free( matrix );
}


int main( void )
{
    size_t row = 3;
    size_t cloum = 2;
    int** arr_2d = create_2d_arr( row, cloum );

    arr_2d[ 0 ][ 0 ] = 4;
    arr_2d[ 0 ][ 1 ] = 5;

    arr_2d[ 1 ][ 0 ] = 6;
    arr_2d[ 1 ][ 1 ] = 7;

    arr_2d[ 2 ][ 0 ] = 8;
    arr_2d[ 2 ][ 1 ] = 9;

    for( size_t i=0; i < row; i++ )
    {
        for( size_t j=0; j < cloum; j++ )
        {
            printf( "arr_2d[%lu,%lu] = %d \n", i, j, arr_2d[ i ][ j ] );
        }
    }

    free_2d_arr( arr_2d, row, cloum );

    return 0;
}
  • 干净地编译
  • 执行所需的功能
  • 将我对老年退休金计划问题的意见纳入其中
  • 为便于阅读,请在括号内、括号内、分号后、逗号后、C运算符周围插入适当的空格
  • 使用
    size\u t
    而不是
    int
    来避免编译器发出有关
    int
    size\u t
    之间转换的警告,尤其是在调用
    calloc()
    malloc()
  • 现在,拟议的守则:

    #include <stdio.h>
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    
    // prototypes
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size );
    
    
    int** create_2d_arr( size_t row_size, size_t colum_size )
    {
        int** array = calloc( row_size, sizeof( int* ) );
        if( !array )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, malloc successful
    
        for ( size_t i = 0; i < row_size; i++ )
        {
            array[ i ] = malloc( sizeof(int) * colum_size );  
            if( !array[ i ] )
            {
                perror( "malloc failed" );
                free_2d_arr( array, row_size, colum_size ); 
                exit( EXIT_FAILURE );
            }
        }
        return array;
    }
    
    
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size ) 
    {
        (void)colum_size;
        for ( size_t i = 0; i < row_size; i++ ) 
        {
            free( matrix[ i ] );
        }
        free( matrix );
    }
    
    
    int main( void )
    {
        size_t row = 3;
        size_t cloum = 2;
        int** arr_2d = create_2d_arr( row, cloum );
    
        arr_2d[ 0 ][ 0 ] = 4;
        arr_2d[ 0 ][ 1 ] = 5;
    
        arr_2d[ 1 ][ 0 ] = 6;
        arr_2d[ 1 ][ 1 ] = 7;
    
        arr_2d[ 2 ][ 0 ] = 8;
        arr_2d[ 2 ][ 1 ] = 9;
    
        for( size_t i=0; i < row; i++ )
        {
            for( size_t j=0; j < cloum; j++ )
            {
                printf( "arr_2d[%lu,%lu] = %d \n", i, j, arr_2d[ i ][ j ] );
            }
        }
    
        free_2d_arr( arr_2d, row, cloum );
    
        return 0;
    }
    
    但是,请注意,声明:

    size_t row = 3;
    size_t cloum = 2;
    

    是程序的真正参数,
    2
    3
    是常量和“神奇”数字神奇的数字是没有基础的数字“魔法”数字使代码更难理解、调试等。建议使用
    #define
    语句或
    enum
    语句为这些“魔法”数字指定有意义的名称,然后在整个代码中使用这些有意义的名称

    以下建议的代码:

    #include <stdio.h>
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    
    // prototypes
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size );
    
    
    int** create_2d_arr( size_t row_size, size_t colum_size )
    {
        int** array = calloc( row_size, sizeof( int* ) );
        if( !array )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, malloc successful
    
        for ( size_t i = 0; i < row_size; i++ )
        {
            array[ i ] = malloc( sizeof(int) * colum_size );  
            if( !array[ i ] )
            {
                perror( "malloc failed" );
                free_2d_arr( array, row_size, colum_size ); 
                exit( EXIT_FAILURE );
            }
        }
        return array;
    }
    
    
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size ) 
    {
        (void)colum_size;
        for ( size_t i = 0; i < row_size; i++ ) 
        {
            free( matrix[ i ] );
        }
        free( matrix );
    }
    
    
    int main( void )
    {
        size_t row = 3;
        size_t cloum = 2;
        int** arr_2d = create_2d_arr( row, cloum );
    
        arr_2d[ 0 ][ 0 ] = 4;
        arr_2d[ 0 ][ 1 ] = 5;
    
        arr_2d[ 1 ][ 0 ] = 6;
        arr_2d[ 1 ][ 1 ] = 7;
    
        arr_2d[ 2 ][ 0 ] = 8;
        arr_2d[ 2 ][ 1 ] = 9;
    
        for( size_t i=0; i < row; i++ )
        {
            for( size_t j=0; j < cloum; j++ )
            {
                printf( "arr_2d[%lu,%lu] = %d \n", i, j, arr_2d[ i ][ j ] );
            }
        }
    
        free_2d_arr( arr_2d, row, cloum );
    
        return 0;
    }
    
  • 干净地编译
  • 执行所需的功能
  • 将我对老年退休金计划问题的意见纳入其中
  • 为便于阅读,请在括号内、括号内、分号后、逗号后、C运算符周围插入适当的空格
  • 使用
    size\u t
    而不是
    int
    来避免编译器发出有关
    int
    size\u t
    之间转换的警告,尤其是在调用
    calloc()
    malloc()
  • 现在,拟议的守则:

    #include <stdio.h>
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    
    // prototypes
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size );
    
    
    int** create_2d_arr( size_t row_size, size_t colum_size )
    {
        int** array = calloc( row_size, sizeof( int* ) );
        if( !array )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, malloc successful
    
        for ( size_t i = 0; i < row_size; i++ )
        {
            array[ i ] = malloc( sizeof(int) * colum_size );  
            if( !array[ i ] )
            {
                perror( "malloc failed" );
                free_2d_arr( array, row_size, colum_size ); 
                exit( EXIT_FAILURE );
            }
        }
        return array;
    }
    
    
    void free_2d_arr( int** matrix, size_t row_size, size_t colum_size ) 
    {
        (void)colum_size;
        for ( size_t i = 0; i < row_size; i++ ) 
        {
            free( matrix[ i ] );
        }
        free( matrix );
    }
    
    
    int main( void )
    {
        size_t row = 3;
        size_t cloum = 2;
        int** arr_2d = create_2d_arr( row, cloum );
    
        arr_2d[ 0 ][ 0 ] = 4;
        arr_2d[ 0 ][ 1 ] = 5;
    
        arr_2d[ 1 ][ 0 ] = 6;
        arr_2d[ 1 ][ 1 ] = 7;
    
        arr_2d[ 2 ][ 0 ] = 8;
        arr_2d[ 2 ][ 1 ] = 9;
    
        for( size_t i=0; i < row; i++ )
        {
            for( size_t j=0; j < cloum; j++ )
            {
                printf( "arr_2d[%lu,%lu] = %d \n", i, j, arr_2d[ i ][ j ] );
            }
        }
    
        free_2d_arr( arr_2d, row, cloum );
    
        return 0;
    }
    
    但是,请注意,声明:

    size_t row = 3;
    size_t cloum = 2;
    


    是程序的真正参数,
    2
    3
    是常量和“神奇”数字神奇的数字是没有基础的数字“魔法”数字使代码更难理解、调试等。建议使用
    #define
    语句或
    enum
    语句为这些“魔法”数字指定有意义的名称,然后在整个代码中使用这些有意义的名称

    arr_2d[0,0]=4->
    arr_2d[0][0]=4您的编译器为此代码向您提供了多少编译器警告?我怀疑您没有在
    printf
    中更改它。您是否使用flags-Wall打开额外警告。我会建议的。嗨,奥西里斯,谢谢你的提示。它工作正常。
    arr_2d[0,0]=4->
    arr_2d[0][0]=4您的编译器为此代码向您提供了多少编译器警告?我怀疑您没有在
    printf
    中更改它。您是否使用flags-Wall打开额外警告。我会建议的。嗨,奥西里斯,谢谢你的提示。它工作正常。好的,但在我修改arr_2d[0][0]=4后,结果看起来不正确;arr_2d[0][1]=5;。。。。arr_2d[0][0]=-267545984 arr_2d[0][1]=-267545952。。。(printf的结果)@D.Wei您确定您已将所有
    [a,b]
    更改为
    [a][b]
    ?我在你的程序上做了,它可以写:4,5。。。前缀为
    arr_2d[..][..]
    Hi bruno的8,9,请参见我的renew@D.Wei我编辑了我的答案,将我执行的更正版本放入OK,但在修改arr_2d[0][0]=4后,结果看起来不正确;arr_2d[0][1]=5;。。。。arr_2d[0][0]=-267545984 arr_2d[0][1]=-267545952。。。(printf的结果)@D.Wei您确定您已将所有
    [a,b]
    更改为
    [a][b]
    ?我在你的程序上做了,它可以写:4,5。。。前缀为
    arr_2d[..][..]
    Hi bruno的8,9,请参见我的renew@D.Wei我编辑了我的答案,把我执行的正确版本放进去。它可能是来自matlab之类的东西。其中(i,j)是正则的。但用方括号括起来,我从来没有把它看作是well@hetepeperfan是的,应该是这样。。。我的意思是我从未在C中见过它;)它可能来自类似matlab的东西。其中(i,j)是正则的。但用方括号括起来,我从来没有把它看作是well@hetepeperfan是的,应该是这样。。。我的意思是我从未在C中见过它;)事实上你可以,但这不是一个很有帮助的方法。。。我不认为你能,逗号运算符能做什么