繁体   English   中英

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

[英]2D array (pointer to pointer)

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

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

(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 )。

或者,如果要使用连续内存块,请将分配行更改为int (*mat)[S] = malloc(R * sizeof *mat);

好吧,您的代码有点偏离。 我将假设您的主要功能在int i, j;之前开始int i, j; 并在调用FillMatrix(mat, R);

如果是这种情况,那么您需要在启动主函数之前移动FillMatrix的函数定义,或者您需要在主函数之前预先声明FillMatrix函数。

问题是您的主函数无法“看到”您的FillMatrix函数。 订单非常重要。 如果尚未声明,定义或以某种方式表明存在问题,那么就编译器而言,该问题就不存在。 可以将其视为在函数中声明变量之前尝试访问某些变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM