使用函数在C中创建和释放二维数组
我参考下面的URL练习2D动态数组: 我的代码:使用函数在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
#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;
}
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;
}
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中见过它;)事实上你可以,但这不是一个很有帮助的方法。。。我不认为你能,逗号运算符能做什么