无法访问我创建的阵列

时间:2015-11-26 13:34:55

标签: c arrays pointers const

我是学生,我不得不承认我的指针有点弱,这就是我练习这个练习的原因。目前我的问题是我的程序在遇到printf时在markMines()函数中崩溃。我相信它,因为它读取了null。我几乎尝试过各种各样的方式。我已经检查了问题从哪里开始,以及它何时开始* field = array;我已经在这几个小时了,我需要一双新眼睛来帮助我。另请注意,所有函数参数和main()都已设置,我无法更改它们。我在下面添加了我的代码。

int main(void)
{
    int **mine=0;
    int r,c;
    initField(&mine,&r,&c); 

    markMines(mine,r,c);    

    return 0;
}

void initField(int ***field, int *rows, int *cols)
{
    int r, c;
    int FieldInput = 0;
    int **array;

    scanf("%d %d", &r, &c );
    array = malloc((r)*sizeof(int));
    *rows = r;
    *cols = c;
    for(r = 0; r < *rows; r++)
    {
        array[r] = malloc((c)*sizeof(int));
    }
    field =&array;
    for(r = 0; r < *rows; r++)
    {
        for(c = 0; c < *cols; c++)
        {
            scanf("%d", &FieldInput);
            array[r][c] = FieldInput;


        }
    printf("\n");
    }



  }

  void markMines(int *const*const field, int rows, int cols)
  { 
    int r = 0, c = 0;
    for(r = 0; r <rows ; r++)
    {  

        for(c = 0; c < cols ; c++)
        {
            printf("%d ", **field );
        }
    }
  }

我很感激任何帮助。

3 个答案:

答案 0 :(得分:0)

  • array = malloc((r)*sizeof(int));错误,因为元素为int*,而不是int
  • field =&array;错误,因为它修改了参数field,而不是mine中的变量main()
  • printf("%d ", **field );可能是错误的,因为它为所有迭代打印相同的元素。
  • 您不应该调用之前未声明的函数。
  • 你应该释放你分配的记忆。

试试这个:

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

void initField(int ***field, int *rows, int *cols)
{
    int r, c;
    int FieldInput = 0;
    int **array;

    scanf("%d %d", &r, &c );
    array = malloc((r)*sizeof(int*));
    *rows = r;
    *cols = c;
    for(r = 0; r < *rows; r++)
    {
        array[r] = malloc((c)*sizeof(int));
    }
    *field = array;
    for(r = 0; r < *rows; r++)
    {
        for(c = 0; c < *cols; c++)
        {
            scanf("%d", &FieldInput);
            array[r][c] = FieldInput;


        }
        printf("\n");
    }

}

void markMines(int *const*const field, int rows, int cols)
{
    int r = 0, c = 0;
    for(r = 0; r <rows ; r++)
    {

        for(c = 0; c < cols ; c++)
        {
            printf("%d ", *(*(field + r) + c) );
        }
    }
}

int main(void)
{
    int **mine = 0;
    int r, c;
    initField(&mine, &r, &c); 

    markMines(mine, r, c);

    for(r--; r >= 0; r--)
    {
        free(mine[r]);
    }
    free(mine);
    return 0;
}

答案 1 :(得分:0)

这些功能完全无效。

程序可以通过以下方式定义。考虑到函数应该在main中使用之前声明。

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

void initField(int ***field, int *rows, int *cols);
void markMines( int *const*const field, int rows, int cols);

int main( void )
{
    int **mine = 0;
    int r, c;
    int i;

    initField(&mine,&r,&c); 

    markMines( mine, r, c );

    for ( i = 0; i < r; i++ ) free( mine[i] );
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    free( mine );
    //^^^^^^^^^^^                                   
}

void initField(int ***field, int *rows, int *cols)
{
    int r, c;
    int FieldInput = 0;
    int **array;

    scanf("%d %d", rows, cols );

    array = malloc( *rows * sizeof( int *) );
    //                             ^^^^^^
    for ( r = 0; r < *rows; r++)
    {
        array[r] = malloc( *cols *sizeof( int ) );
    }

    *field = array;
    //^^^^^^^^^^^^^
    for ( r = 0; r < *rows; r++ )
    {
        for ( c = 0; c < *cols; c++ )
        {
            scanf("%d", &FieldInput);
            array[r][c] = FieldInput;
        }
        printf("\n");
    }
}

void markMines( int *const*const field, int rows, int cols)
{ 
    int r = 0, c = 0;

    for(r = 0; r <rows ; r++)
    {  
        for(c = 0; c < cols ; c++)
        {
            printf( "%d ", *( *( field + r ) + c ) );
            //             ^^^^^^^^^^^^^^^^^^^^^^^
        }
        printf( "\n" );
    }
}

答案 2 :(得分:0)

您将错误的尺寸传递给malloc以分配array。您需要分配一个指针数组,而不是int数组。使用:

array = malloc((r)*sizeof(int *));

或:

array = malloc((r)*sizeof(*array));

或:

array = calloc(r, sizeof(int *));

或:

array = calloc(r, sizeof(*array));