2012-10-01 77 views
-1

当我打电话给我的calculatePlaneEQ函数时,它给我一个访问冲突时,我分配值返回...我生锈的指针,但它似乎应该工作!0xC0000005:访问冲突写入位置0xcccccccc

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

CALL:

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

DEF:

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; 
} 
+2

这些指针在传递给函数之前是否分配给了有效的内存位置? – Mahesh

+1

你的'plane ...'指针都没有值。 –

+0

@Mahesh:再看看,指针分配是在问题(我想他们在第一次过) –

回答

1

似乎你正在做太多的间接程度。

float planeCoefA, planeCoefB, planeCoefC, planeCoefD; 

呼叫

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

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float* myD) 
{ 
... 
    *myXnorm = 12.1f; 
... 
1
float *planeCoefA, *planeCoefB, *planeCoefC, *planeCoefD = NULL; 

您还没有初始化您的任何指针。 planeCoefA,planeCoefBplaneCoefC将具有随机值。只有planeCoefD被分配为NULL,但这不适用于写入。

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

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

// ... 

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

添加间接的另一个水平的唯一原因(即float** v float*)是,如果你需要修改的说法使得它可以被调用者看到的(因为,记住,你是通过值传递这些参数)。你只需要写入指针指向的内存位置,所以一个指针就足够了。

+0

为了更具体一点,你已经为指针分配了空间,但是当你在这个赋值中取消引用它们,例如*(* myXnorm)= xNorm;没有分配内存来分配真正的位。 – David

+0

@David:不,指针的空间已经分配*。它们的值ne编辑将被初始化为有效的内存地址。 –

+0

我不小心碰到了回报。 – David

8

它应该是:

float planeCoefA, planeCoefB, planeCoefC, planeCoefD; 

CALL:

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

DEF:

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

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

CALL:

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

DEF:

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式指针的使用,并且是不易出错。

0

您可以随时与真正的浮动和参考工作,使事情变得更简单了自己和他人。

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

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

DEF:

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

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

} 

如果你愿意的话,出于某种原因,使用指针,那么您可以在函数签名使用float指针:

在这种情况下
void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float * myD) 

那么您需要先每个变量名称由一个星号在该函数体内:

*myXNorm = 1.3; 

但是,你呢然后ld运行被传递无效指针的风险。