将指针传递给函数异常

时间:2015-03-10 10:06:12

标签: c function pointers pass-by-value

为什么以下程序的输出为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);
}

4 个答案:

答案 0 :(得分:3)

GetElement()函数中,res2已使用pass-by-value传递。 pElementGetElement()函数的本地。

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

因此,从GetElement()函数返回后,res2中的main()仍为NULL。

注意:如果要从res2函数更改GetElement(),则需要将指针传递给res2作为参数。

答案 1 :(得分:3)

你没有返回任何指针,我的猜测是你要传递指针的地址并指定它的值

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

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

答案 2 :(得分:1)

尝试

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

答案 3 :(得分:1)

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

您可以想象函数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;
}

因此,pElementres2 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 );