使用2D指针时出错

error using 2D pointers

本文关键字:出错 指针 2D 使用      更新时间:2023-10-16

我是这个网站的新手,如果我问错了问题,请原谅。

在我的编程课程中,我被要求编写一个函数,该函数将使用指针给出两个平方矩阵(3x3)的乘积。

这是我写的代码:

    //This function make a LxC matrix out of a double pointer
void matrixMake(double **a,int unsigned l,int unsigned c)
{
    a=new double*[l];
    for(int i=0;i<l;i++)
    {
        a[i]=new double[c];
    }
}
//This function returns a random number between a and b
double randU(double a=0.0,double b=10.0)
{
    double x=(double)(rand()/RAND_MAX);
    return(a*x+b*(1-x));
}
//This is the function that seems to be a problem, this function creates a matrix and fills it with random numbers between 0 and 10.
double ** matrixGen()
{
    double **matrix;
    matrixMake(matrix,3,3);
    for(int i=0;i<3;i++)
    {
        for(int n=0;n<3;n++)
        {
            matrix[i][n]=randU();
        }
    }
    return(matrix);
}

它编译得很好,只是当我运行程序时,它会给我一个丑陋的分段错误。我试着调试它,当它运行执行matrix[i][n]=randU();的行时,它崩溃了。

它没有给你完整的代码,其余的与我的问题无关,似乎工作得很好。

我希望我的问题不要太愚蠢^^。。。提前感谢!:D

除了校正matrixMake:的签名

void matrixMake(double**& a, unsigned l, unsigned c)

你也应该纠正这一点:

double x=(double)(rand()/RAND_MAX);//x总是评估为零

进入这个:

double x=((double)rand())/RAND_MAX);

之所以会出现此问题,是因为当您将double **matrix传递给matrixMake函数时,内存地址会被复制,因此您对该函数内部所做的任何操作都不会在主函数中坚持使用double **matrix

你可以试试这个:

double ** matrixMake(int unsigned l,int unsigned c)
{
    double ** a;
    a=new double*[l];
    for(int i=0;i<l;i++)
    {
        a[i]=new double[c];
    }
    return a;
}

在你的主要功能中有

double **matrix = matrixMake(3,3);

而不是

double **matrix;
matrixMake(matrix,3,3);

您也可以尝试通过指针或引用将double**传递给matrixMake,但这将使您成为三星级程序员,这不是一件好事。不管怎样,它看起来都是这样的:

void matrixMake(double ***a,int unsigned l,int unsigned c)
{
    *a=new double*[l];
    for(int i=0;i<l;i++)
    {
        *a[i]=new double[c];
    }
}

代码中没有matrixMake(matrix,3,3);,而是有matrixMake(&matrix,3,3);

void matrixMake(double **a,int unsigned l,int unsigned c)
{
    a=new double*[l];
    for(int i=0;i<l;i++)
    {
        a[i]=new double[c];
    }
}

此函数按值接收指针,然后立即将其赋值,忽略传入的值。如果要修改指针,则需要通过引用(double**&)或指针(double***)传入。或者,您可以从函数中返回一个新的指针,因为它的值不取决于传入的内容

double** matrixMake(int unsigned l,int unsigned c)
{
    double** a=new double*[l];
    for(int i=0;i<l;i++)
    {
        a[i]=new double[c];
    }
    return a;
}