-1

当我调用我的calculatePlaneEQ函数时,当我重新分配值时,它会引发访问冲突......我的指针生锈了,但似乎这应该可以工作!

float *planeCoefA, *planeCoefB, *planeCoefC, *planeCoefD = NULL;

称呼:

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

防御:

void calculatePlaneEQ (<...>, float ** myXnorm, float ** myYnorm, float ** myZnorm, float** myD)
{
    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    *(*myXnorm) = xNorm;
    *(*myYnorm) = yNorm;
    *(*myZnorm) = zNorm;
    *(*myD) = eqD;  
}
4

4 回答 4

8

它应该是:

float planeCoefA, planeCoefB, planeCoefC, planeCoefD;

称呼:

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

防御:

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float * myD)
{

    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    *myXnorm = xNorm;
    *myYnorm = yNorm;
    *myZnorm = zNorm;
    *myD = eqD;
}

更好的是,使用引用而不是指针:

称呼:

calculatePlaneEQ (<...>, planeCoefA, planeCoefB, planeCoefC, planeCoefD);

防御:

void calculatePlaneEQ (<...>, float &myXnorm, float &myYnorm, float &myZnorm, float &myD)
{

    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    myXnorm = xNorm;
    myYnorm = yNorm;
    myZnorm = zNorm;
    myD = eqD;
}

这比 C 风格的指针使用更惯用 C++,而且更不容易出错。

于 2012-10-01T21:01:25.093 回答
1
float *planeCoefA, *planeCoefB, *planeCoefC, *planeCoefD = NULL;

您还没有初始化任何指针。 planeCoefA, planeCoefB, 并且planeCoefC将具有随机值。OnlyplaneCoefD被分配NULL,但这对任何一个都无效。

但是,无论如何,您仍然只为这些内存位置分配值。这是未定义的行为。指针是变量,它们的值是内存地址。但是,它们不会自动指向有效内存;他们需要被初始化。

float planeCoefA = 0, planeCoefB = 0, planeCoefC = 0, planeCoefD = 0;

// ...

void calculatePlaneEQ (<...>, float *myXnorm, float *myYnorm, float *myZnorm, float* myD)

添加另一个间接级别(即float**v float*)的唯一原因是如果您需要修改参数以便调用者可以看到它(因为,请记住;您通过 value传递这些参数)。您只需要写入指针所指的内存位置,因此单个指针就足够了。

于 2012-10-01T21:00:30.373 回答
1

似乎您正在做太多的间接级别。

float planeCoefA, planeCoefB, planeCoefC, planeCoefD;

称呼

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float* myD)
{
 ...
  *myXnorm = 12.1f;
 ...
于 2012-10-01T21:04:48.710 回答
0

您始终可以使用真正的浮动和参考,以使您和他人的事情变得更简单。

float planeCoefA = 0.0;
float planeCoefB = 0.0;
float planeCoefC = 0.0;
float planeCoefD = 0.0;

调用:calculatePlaneEQ(<...>,planeCoefA,planeCoefB,planeCoefC,planeCoefD);

防御:

void calculatePlaneEQ (<...>, float & myXnorm, float & myYnorm, float & myZnorm, float & myD)
{

    myXNorm = 1.3;
    myYNorm = 1.4;
    myZNorm = 1.5;
    myD = 1.6; 

}

如果出于某种原因您更喜欢使用指针,那么您可以在函数签名中使用浮点指针:

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float * myD)

在这种情况下,您将在函数主体中的每个变量名称前加上一个星号:

*myXNorm = 1.3;

但是,您将冒着被传递无效指针的风险。

于 2012-10-01T21:12:08.687 回答