【问题标题】:parameter passing in C functionC函数中的参数传递
【发布时间】:2013-02-17 17:36:31
【问题描述】:

我有一个用 C 编写的函数

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);

BeginKey是函数调用前的指针,我没有初始化,像

BeginKey = NULL;

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

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

【问题讨论】:

  • 你能告诉我们FindBeginKey的类型和你传入的所有参数的类型吗?

标签: c function parameter-passing


【解决方案1】:

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

例如

FindFoo(FOO** BeginKey);

然后调用它:

FindFoo(&BeginKey);

在函数中:

*BeginKey = 0xDEADC0DE;

【讨论】:

    【解决方案2】:

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

    FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
    

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

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

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

    【讨论】:

      【解决方案3】:

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

      void subroutine(int* x) {
         *x = 5;   // will modify the variable which x points to
      
         x = 5;  // INVALID! x is a pointer, not an integer
      }
      

      【讨论】:

        【解决方案4】:

        我不知道现在所有的 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,这样您的指针就会指向正确的内存。

        【讨论】:

          猜你喜欢
          • 2012-09-26
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-27
          相关资源
          最近更新 更多