【问题标题】:2d array initialized with malloc/calloc用 malloc/calloc 初始化的二维数组
【发布时间】:2014-12-10 04:57:19
【问题描述】:

好的,我无法理解如何在 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("%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;
}

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

【问题讨论】:

  • 不要使用隐式 int 返回类型。另外,Don't cast the result of malloc (and friends).
  • 你的代码现在看起来不错
  • @Laura Kent 看看我的回答。它会对你有用。:)
  • 看“相关”,有数百个线程用于如何 malloc 二维数组。
  • 程序的编辑版本还有一个问题。 'int main(void)' 行将导致编译器(启用所有警告)抱怨。该行应该是:'int main()'

标签: c matrix malloc multidimensional-array


【解决方案1】:

mat 是一个双指针。您需要为指针数组分配内存,然后分别为每个指针分配内存。

mat[0] = malloc(sizeof(int) *n ); /* n = Number of elements */

mat[0] 在写入之前应该分配一些内存。

那么你有mat[i][j]scanf() 是有意义的。 无需投malloc()

【讨论】:

  • @Laura Kent 对于这个答案,您可以在第一个循环中完成。
  • 谢谢,但我仍然对如何实施您的建议有些困惑。我应该使用循环为每个指针分配内存吗?
【解决方案2】:

希望我的回答对你有用。

如果您使用的是支持 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 测试程序。

【讨论】:

  • 这一行: int main( void ) 无效。而是使用: int main()
  • @user3629249 你完全错了,不懂C。
  • @user3629249 在 C 2011 之前,函数 main 应声明为具有参数 void。至于我的帖子,我展示了用 C89 编写的程序,因为即使不是所有现代编译器都支持 C99。例如,到目前为止,MS VS 不支持 C99。所以我帖子中main的声明对应C89,C99标准。
  • @user3629249 这是我的示例,使用 www.ideone.com 编写并选择语言 C99 严格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2012-08-10
  • 2012-11-29
相关资源
最近更新 更多