C - 使用 malloc/calloc 初始化的 2D 数组



好吧,我很难理解如何在 calloc 中使用 malloc 来初始化数组。我正在尝试通过创建一个存储用户输入值的 2 * 3 矩阵来进行一些练习。我不想更改代码的唯一部分是使用 **matrix 而不是 matrix[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("%dt",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("%dt",mat[i][j]);
return 0;
}

如果有任何理由我应该进行更多编辑,请告诉我。

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;
}

在这两种情况下,程序将输出相同的矩阵

1  2  3 
4  5  6 

如果要增加这些值。

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

相关内容

  • 没有找到相关文章

最新更新