【问题标题】:Passing Pointer to Function Anomaly将指针传递给函数异常
【发布时间】:2015-05-11 17:16:25
【问题描述】:

为什么下面程序的输出会是0x0?

BYTE n_buffer[4] = { 1, 2, 3, 4};

int GetElement(BYTE *pElement, DWORD dwIndex)
{
    pElement = &n_buffer[dwIndex];
    return SUCCESS;
}

int main()
{
    BYTE *res2 = NULL;
    GetElement(res2, 3);
    printf("0x%X\n", res2);
}

【问题讨论】:

  • 什么是BYTE? char? char *?
  • 基本上是无符号字符。
  • func(x) 永远不会改变x。 C 使用按值传递,这意味着函数接收参数的副本。 (想象一下,如果这不是真的,func(5) 会发生什么……)

标签: c function pointers pass-by-value


【解决方案1】:

在您的 GetElement() 函数中,res2 已使用按值传递。 pElement 是 GetElement() 函数的本地函数。

对*pElement 的任何更改都将反映在main() 中,对pElement 本身的更改不会。

所以,从GetElement() 函数返回后,main() 中的res2 仍将为 NULL。

注意:如果你想从GetElement()函数改变res2,你需要传递一个指向res2的指针作为参数。

【讨论】:

    【解决方案2】:

    你没有返回任何指针,我的猜测是你想传递指针的地址并为其赋值

    int GetElement(BYTE **pElement, DWORD dwIndex)
    {
     *pElement = &n_buffer[dwIndex];
     return SUCCESS;
    }
    

    尝试绘制指针及其指向的位置,并阅读更多关于指针的信息。

    【讨论】:

      【解决方案3】:

      试试

      int GetElement(BYTE **pElement, DWORD dwIndex)
      {
          *pElement = &n_buffer[dwIndex];
          return SUCCESS;
      }
      

      和主要的

      int main()
      {
          BYTE *res2 = NULL;
          GetElement(&res2, 3);
          printf("0x%X\n", res2);
      }
      

      【讨论】:

        【解决方案4】:

        函数参数是函数的局部变量。退出函数后,它们被销毁。

        你可以想象函数GetElement

        int GetElement(BYTE *pElement, DWORD dwIndex)
        {
            pElement = &n_buffer[dwIndex];
            return SUCCESS;
        }
        

        及其调用

        BYTE *res2 = NULL;
        GetElement(res2, 3);
        

        以下方式

        int GetElement()
        {
            BYTE *pElement = res2, 
            DWORD dwIndex = 3;
        
            pElement = &n_buffer[dwIndex];
            return SUCCESS;
        }
        

        因此,因为pElement 拥有res2 值的副本,res2 本身不会被更改。

        你应该定义函数并按以下方式调用它

        int GetElement(BYTE **pElement, DWORD dwIndex)
        {
            *pElement = &n_buffer[dwIndex];
            return SUCCESS;
        }
        
        // ...
        
        BYTE *res2 = NULL;
        GetElement( &res2, 3 );
        

        另一种方法是像这样定义函数

        BYTE * GetElement( DWORD dwIndex)
        {
            return (dwIndex < 4 ? &n_buffer[dwIndex] : NULL );
        }
        
        // ...
        
        BYTE *res2 = NULL;
        res2 = GetElement( 3 );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-06
          • 2021-09-07
          • 2016-11-07
          相关资源
          最近更新 更多