1

我有一个用 C 编写的函数

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);

BeginKey 是函数调用之前的指针,我没有启动它,比如

BeginKey = NULL;

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

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

4

4 回答 4

0

据我了解,您调用的函数如下:

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);

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

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

如果这不是您的意思,那么发布代码示例肯定会有所帮助。

于 2013-02-17T17:41:20.810 回答
0

要从函数中传递一个值,您必须通过引用而不是像 C 函数通常那样通过值传递。为此,请使参数成为指向要传递的类型的指针。&然后使用(地址操作数)将该值传递给调用。

例如

FindFoo(FOO** BeginKey);

并称之为:

FindFoo(&BeginKey);

并在函数中:

*BeginKey = 0xDEADC0DE;
于 2013-02-17T17:41:22.857 回答
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;

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

另一方面,如果您正在编写一个函数来为指针分配内存,则传递指针的地址(指向指针的指针)&pStruct1,这样您的指针就会指向正确的内存。

于 2013-02-17T18:21:49.253 回答
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
}
于 2013-02-17T17:43:51.193 回答