2D数组(指向指针的指针)

时间:2015-12-07 20:33:55

标签: c

我想用随机数填充2D数组,然后在main函数中调用它并打印它。但我无法从FillMatrix访问函数main

#define R 12 //row
#define S 10 //column

void FillMatrix(int m[][S], int row);
int main(int argc, char *argv[])
{
    int i, j;
    time_t t;

    // POINTER TO POINTER
    int **mat = (int **)malloc(R * sizeof(int *));
    if ((mat = (int**)malloc(R*sizeof(int))) == NULL)
    {
        printf("Error");
        return 0;
    }

    for (i = 0; i<R; i++)
        mat[i] = (int *)malloc(S * sizeof(int));

    FillMatrix(mat, R); //<- This line is the problem

    // RAND 0 - 1000
}

void FillMatrix(int m[][S], int row)
{
    int i, j;
    time_t t;
    srand((unsigned)time(&t));
    for (i = 0; i < row; i++)
        for (j = 0; j < S; j++)
            m[i][j] = rand() % 1000 + 0;
}

2 个答案:

答案 0 :(得分:2)

<build> <pluginManagement> <plugins> <plugin> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> </dependency> </plugin> </plugins> </pluginManagement> </build> 分配错误的空间;类型应为(mat = (int**)malloc(R*sizeof(int))或等效sizeof(int *)。你也泄漏了刚刚在前一行分配的内存。

要解决此问题,请将sizeof *mat更改为if ((mat = (int**)malloc(R*sizeof(int))) == NULL)

此外,if ( mat == NULL )int **不兼容。 int[][S]表示一个数组,其中每一行是单独的分配,但int **表示一个连续的内存块。您必须选择要使用的这两种方法中的哪一种。

如果要使用单独的行,则将函数更改为int [][S](将列数作为参数,而不是使用全局void FillMatrix(int **m, int row)将是一种很好的方式)

或者,如果要使用连续内存块,请将分配行更改为S

答案 1 :(得分:1)

嗯,你的代码有点偏差。我将假设您的主要功能在int i, j;之前开始,并在调用FillMatrix(mat, R);之后结束。

如果是这种情况,则需要在启动main函数之前移动FillMatrix的函数定义,或者需要在main函数之前转发声明FillMatrix函数。

问题是您的主要功能无法“看到”您的FillMatrix功能。订单非常重要。如果某些内容尚未被声​​明,定义或以某种方式显示存在于问题中,那么就编译器而言它就不存在。可以把它想象成在函数中声明它之前尝试访问某个变量。