为什么以下程序的输出为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);
}
答案 0 :(得分:3)
在GetElement()
函数中,res2
已使用pass-by-value传递。 pElement
是GetElement()
函数的本地。
对*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;
}
因此,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 );