好吧,我无法理解如何在calloc中使用malloc来初始化数组。我试图通过创建一个存储用户输入值的2 * 3矩阵来做一些练习。我不想改变的代码的唯一部分是使用**矩阵而不是矩阵[5] [7]。有什么建议吗?
到目前为止我的代码(我不断收到分段错误):
#include<stdio.h>
#include<stdlib.h>
main(){
int i, j;
int **mat = (int **)malloc(2 * 3 * sizeof(int*));
for(i=0;i<2;i++)
for(j=0;j<3;j++){
printf("Input a value for Array[%d][%d]: ",i,j);
scanf("%d",&mat[i][j]);
}
for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d\t",mat[i][j]);
}
编辑:我感谢大家的帮助!我的代码现在没有错误。这就是它的样子:
#include<stdio.h>
#include<stdlib.h>
main(){
int i, j;
int **mat;
mat = malloc(2 *sizeof(int *));
for(i=0;i<2;i++){
mat[i] = malloc(3 *sizeof(int));
for(j=0;j<3;j++){
printf("Input a value for Array[%d][%d]: ",i,j);
scanf("%d",&mat[i][j]);
}
}
for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d\t",mat[i][j]);
return 0;
}
如果有任何原因我应该进行更多编辑,请告诉我。
答案 0 :(得分:1)
mat
是一个双指针。您需要为指针数组分配内存,然后分别为每个指针分配内存。
mat[0] = malloc(sizeof(int) *n ); /* n = Number of elements */
mat[0]
在写入之前应该分配一些内存。
然后,您scanf()
所在的mat[i][j]
有意义。
无需投射malloc()
答案 1 :(得分:1)
我希望无论如何我的回答对你有用。
如果您使用的是支持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;
}
在这两种情况下,程序将输出相同的矩阵
1 2 3
4 5 6
如果要使用这些值。
您可以在www.ideone.com上测试该程序,选择语言strict C99
。