如下面:
    long *pi;
    pi = new long(1000);
    long **ppi = π
    int i = *pi;  //i的值为1000,天啊,怎么可能呢?*pi应是一个指针地址值--(1)若最后一句改为:
    int i = *((long*)(*pi));           -------(2)
则报内存非法错误,为什么啊?我认为(1)的做法
是错误的,但(1)偏偏没错,(2)的做法才正确啊,请大家指点。
今天脑子出问题了。

解决方案 »

  1.   

    int i = *((long*)(**pi));
      

  2.   

    (long*)(*pi)这个操作想把long型转换为long *,当然报错了
    应该是:
    int i = *((long*)pi);
    int i = *((long*)(*ppi));       (我上面也写错了)
      

  3.   

    pi是指针,*pi当然就是1000.**ppi才是地址.
      

  4.   

    int i = *((long*)(*pi));
    *pi不是指针了,还用long*来强制转换应该错啊
    int i = *((long*)pi);
    这样应该可以
    不过强制转换就多余了
    pi本来就是long*的
      

  5.   

    2,还是那句话,你把ppi和pi搞混了!!!
      

  6.   

    (1)long *pi;
        pi = new long(1000);
        int i = *pi;  //i的值为1000,天啊,怎么可能呢?*pi应是一个指针地址值--(1)
    这样看就清楚了吧,不是什么指针,是pi[0],long型,只不过这里应该是个随机值。(2)*((long*)(*pi)); 
    来分析一下(*pi)是long (参1),
    (long*)(*pi)怎么解释?
    自己指定的地址吗?
    在加个*变成 :*((long*)(*pi)),怎么解释?(long*)(*pi)的地址吗?
    好,假设你是要这样的结果。
    为什么报错呢?
    该地址是虚拟内存中合理的地址吗?是可以访问的范围吗?
      

  7.   

    搞错了,第(2)应是:
    int i = *((long*)(*ppi));           -------(2)
    哎,今天不在状态。
    其实这个问题我是想问SAFEARRAY的问题,如下:
    COM服务器中有个函数:
    STDMETHODIMP TCoMyCom::QueryName(LPSAFEARRAY* Name)
    {
      try
      {
          SAFEARRAY *psa;
          psa = SafeArrayCreateVector(VT_BSTR,0,10);
          BSTR bstr;
          long ix[1];
          
          for(int i = 0;i<10;i++)
          {
              bstr = BSTR("aaa");
              ix[0] = 0;
              SafeArrayPutElement(psa,&ix[0],bstr);
              SysFreeString(bstr);
          }
         Name = &psa;
      }
      catch(Exception &e)
      {
        return Error(e.Message.c_str(), IID_ICoQueryDB);
      }
      return S_OK;
    }客户调用时,
      LPSAFEARRAY* Name = NULL;
      if(SUCCEEDED(pMyInerface->QueryName(Name))  //pMyInerface为得到的接口
      {
         int i = (*name)->cbElements;  //竟报内存错误,为什么呢?
      }我是COM菜鸟,请大家指点。
      

  8.   

    codewarrior(会思考的草)说的对,
    写错误了。
    请大家回答我那个COM的问题,
    头都大了,
    谢谢!
      

  9.   

    int i = (int)(*pi);还有就是不要把long强制转换为int,截断会产生误差的。
      

  10.   

    long *pi;
    pi = new long(1000);//------------------long[1000]
      

  11.   

    回复人: pomelowu(羽战士) ( ) 信誉:118  2004-07-26 15:46:00  得分: 0  
    int i = (int)(*pi);
    还有就是不要把long强制转换为int,截断会产生误差的。
    >>long 和 int 在win32 下都是 32 bit,不存在截断。
      
     
      

  12.   

    客户调用时,
      LPSAFEARRAY* Name = NULL;
      if(SUCCEEDED(pMyInerface->QueryName(Name))  //pMyInerface为得到的接口
      {
         int i = (*name)->cbElements;  //竟报内存错误,为什么呢?
      }
    1 首先你要确定 Name 的值 正确。