在DirectX8中,有如下代码:
D3DXINLINE D3DXVECTOR3* D3DXVec3Cross
    ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
{
    D3DXVECTOR3 v;    v.x = pV1->y * pV2->z - pV1->z * pV2->y;
    v.y = pV1->z * pV2->x - pV1->x * pV2->z;
    v.z = pV1->x * pV2->y - pV1->y * pV2->x;    *pOut = v;
    return pOut;
}
还有很多类似的代码,他都明确指出该函数的返回值可以直接作为函数的参数使用!
我的问题是:
D3DXVECTOR3 v; 作为一个函数栈对象,能被传出函数吗?为什么?

解决方案 »

  1.   

    怎么不能,当然可以void func()
    {
       int iret=0
       //....
       return iret;
    }
    有问题吗?没有,传出去的方式也是堆栈
    上面的也是没有问题的
    不过你的当心,这个传出的地址或者变量都是非常易失去的,不要企图把他保存起来,最好立刻将返回内容取出来,否则下次用到堆栈的时候,由于你引用的空间在栈顶以上,你访问的内容将发生错误,
    一般对比较复杂的东西都有两种方法返回
    一种是 static你要返回的东东,这样,知道你下次调用这个函数上次的返回值才会失效。
    一种是立即复制出来,如上D3DXVECTOR3 VectorRet=*D3DXVec3Cross(...)不要启动这样用
       D3DXVec3Cross(...)->...
       ....
       D3DXVec3Cross(...)->...
    容易出问题
      

  2.   

    *pOut = v;其实已经执行了一次赋值了。也就是说v的值已经拷贝到pOut指向的内存;
    如果是return &v;就不行
      

  3.   

    *pOut = v;其实已经执行了一次赋值了。也就是说v的值已经拷贝到pOut指向的内存;
    如果是return &v;就不行