2013-02-17 71 views
1

我用C写的参数传递的C函数

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); 

BeginKey是之前调用函数的指针,而我并没有启动它的功能,像

BeginKey = NULL; 

FindBeginKey()功能,我将BeginKey分配给另一个指针,并尝试在功能中打印出BeginKey的当前地址,它工作正确。 但是,当代码从函数返回时,我尝试再次打印出BeginKey的地址,它显示0x0

为什么会发生这种情况,如果我想保留函数中分配的地址,我该怎么办?

+0

你能告诉我们“FindBeginKey”的类型以及你传入的所有参数的类型吗? – Xymostech 2013-02-17 17:40:11

回答

0

要传递一个值超出必须通过引用而非由值传递的功能的作为通常使用C函数的情况。为此,使参数成为您想要传递的类型的指针。然后将值传递给&(地址操作数)的调用。

例如

FindFoo(FOO** BeginKey); 

,并称之为:

FindFoo(&BeginKey); 

,并在功能:

*BeginKey = 0xDEADC0DE; 
0

据我所知,您呼叫的功能等:

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); 

但是,当你试图在BeginKey地址写的,你基本上是在传递一个指针为0x00。相反,你需要传递一个指向BeginKey的指针。

FindBeginKey(KeyListTraverser, BeginPage, &BeginKey, key1); 

如果这不是你的意思,它肯定会有帮助,如果你发布的代码示例。

0

如果你想修改子程序的参数,你应该传递的东西的指针你想修改。

void subroutine(int* x) { 
    *x = 5; // will modify the variable which x points to 

    x = 5; // INVALID! x is a pointer, not an integer 
} 
0

我不知道现在所有的C参数传递规则,所以这个答案可能有点过时。从构建应用程序所调用的应用程序和库的常见做法来看,C函数的返回将包含状态,因此函数的调用者可以根据状态代码作出决定。

如果你想修改它的输入参数的功能,则可以通过将参考&my_val,其中int my_val;传递这些参数。而且你的函数必须像这个*my_val一样取消引用my_val来获得它的值。

此外,出于性能方面的原因,地址(通过引用)可能更可取,以便您的应用程序不会打扰将参数的值复制到局部变量中。该序言码由编译器生成。单个参数,char,int等等非常简单。

我很习惯C++在C++中通过引用传递,不需要解引用。编译器的代码为您处理。

但是,请考虑将指针传递给结构。

struct my_struct 
{      
    int iType; 
    char szName[100]; 
} struct1; 

struct my_struct *pStruct1 = &struct1; 

如果该结构包含填充在上一次初始化,然后在你的程序中引用查找数据,然后按值传递pStruct1一个指针结构。如果您正在编写函数来填充该结构或更改已经存在的数据,则将值传递给结构的指针。你仍然可以改变结构指针指向的内容。

如果另一方面您正在编写一个函数来为指针分配内存,然后传递指针的地址(指向指针的指针)&pStruct1,以便您将指针指向正确的内存。