Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C函数中的参数传递_C_Function_Parameter Passing - Fatal编程技术网

C函数中的参数传递

C函数中的参数传递,c,function,parameter-passing,C,Function,Parameter Passing,我有一个用C写的函数 FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); BeginKey是函数调用之前的一个指针,我没有启动它,比如 BeginKey = NULL; 在FindBeginKey()函数中,我将BeginKey分配给另一个指针,并尝试在函数中打印出BeginKey的当前地址,它工作正常。 但是当代码从函数返回时,我再次尝试打印出BeginKey的地址,它显示0x0 为什么会发生这种情况?如果我想保留函数中分配

我有一个用C写的函数

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
BeginKey是函数调用之前的一个指针,我没有启动它,比如

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


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

据我所知,您调用函数的方式如下:

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

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

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

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

e、 g

并称之为:

FindFoo(&BeginKey);
在函数中:

*BeginKey = 0xDEADC0DE;

如果要修改子例程中的参数,应该传递要修改的对象的指针

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

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

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

如果您希望函数修改其输入参数,您可以通过引用
&my\u val
传递这些参数,其中
int my\u val。您的函数必须像这样取消对my_val的引用才能获得其值

此外,出于性能原因,和地址(通过引用)可能更可取,这样应用程序就不会麻烦将参数的值复制到局部变量中。该prolog代码由编译器生成。单参数、char、int等都是相当直接的

<>我习惯C++,在C++中引用引用不需要取消引用。编译器的代码为您解决了这一问题

但是,可以考虑将指针传递给结构

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

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


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

您能给我们展示一下
FindBeginKey
的类型以及您传入的所有参数的类型吗?
struct my_struct  
{                    
  int iType;
  char szName[100];
} struct1;

struct my_struct *pStruct1 = &struct1;