Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 2D数组(指针到指针)_C - Fatal编程技术网

C 2D数组(指针到指针)

C 2D数组(指针到指针),c,C,我想用随机数填充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 **)

我想用随机数填充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;
}
#定义R 12//行
#定义s10//列
无效填充矩阵(int m[][S],int行);
int main(int argc,char*argv[])
{
int i,j;
时间;
//指针到指针
int**mat=(int**)malloc(R*sizeof(int*);
if((mat=(int**)malloc(R*sizeof(int)))==NULL)
{
printf(“错误”);
返回0;
}

对于(i=0;i嗯,你的代码有点不正确。我假设你的主函数在
inti,j;
之前开始,在调用
FillMatrix(mat,R);
之后结束

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

问题是您的主要功能无法“查看”你的FillMatrix函数。顺序非常重要。如果某个东西没有被声明、定义,或者没有以某种方式显示在问题点上存在,那么就编译器而言它就不存在了。把它想象成在函数中声明某个变量之前试图访问某个变量。

(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]]MALOC(R*sieZOF*Mat);尝试/>代码>空格填充矩阵(int M[[][IN]行),主要之前。您想要C还是C++答案?C=C++,一般来说,您只应该标记您正在编写/编译的语言。(例如,在C++中选择容器类,然后在执行原始内存分配之前使用智能指针,而在C中,你不应该把代码的结果写在<代码> MalOC/<代码>)。我想在C.中回答,我编辑了代码,所以现在有一个main函数。我把函数改为“无效fimMatLL(int m,int行)”。“无法将参数从'int'转换为'int[][S]'”。如果出现此错误,则实际上并没有像您所说的那样更改函数。可能您忘记更改原型和定义