我有一个用C写的函数
FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
BeginKey是函数调用之前的指针,我没有启动它,比如
BeginKey = NULL;
在FindBeginKey()
函数中,我将BeginKey
指定给另一个指针,并尝试在函数中打印出BeginKey
的当前地址,它的工作正常。
但是当代码从函数返回时,我尝试再次打印出BeginKey
的地址,它会显示0x0
。
为什么会发生这种情况,如果我想保留函数中指定的地址,我该怎么办?
答案 0 :(得分:0)
据我所知,您正在调用以下函数:
FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
但是,当您尝试在BeginKey地址处写入时,您基本上是将指针传递给0x00。相反,您需要将指针传递给BeginKey。
FindBeginKey(KeyListTraverser, BeginPage, &BeginKey, key1);
如果这不是您的意思,那么如果您发布了代码示例,那肯定会有所帮助。
答案 1 :(得分:0)
要从函数中传递一个值,您必须通过引用而不是按值传递,这通常是C函数的情况。要执行此操作,请将参数指向要传递的类型的指针。然后使用&
(地址操作数)将值传递给调用。
e.g。
FindFoo(FOO** BeginKey);
并称之为:
FindFoo(&BeginKey);
并在函数中:
*BeginKey = 0xDEADC0DE;
答案 2 :(得分: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
}
答案 3 :(得分:0)
我现在还不知道所有C参数传递规则是什么,所以这个答案可能有点过时了。从构建那些应用程序调用的应用程序和库的常规做法来看,C函数的返回将包含状态,因此函数的调用者可以根据状态代码做出决定。
如果您希望该函数修改其输入参数,您可以通过引用&my_val
传递这些参数,其中int my_val;
。并且您的函数必须取消引用my_val,如*my_val
以获取其值。
此外,出于性能原因,地址(通过引用)可能更为可取,因此您的应用程序不会将参数的值复制到局部变量中。该prolog代码由编译器生成。单个参数,char,int等非常简单。
我习惯于C ++,在C ++中通过引用传递不需要解除引用。编译器的代码会为您解决这个问题。
但是,考虑将指针传递给结构。
struct my_struct
{
int iType;
char szName[100];
} struct1;
struct my_struct *pStruct1 = &struct1;
如果结构包含在初始化时填充一次然后在整个程序中引用的查找数据,则通过值pStruct1
传递指向结构的指针。如果要编写函数来填充该结构或更改已存在的数据,则按值传递指向结构的指针。你仍然可以改变结构指针指向的内容。
另一方面,如果你正在编写一个函数来为指针分配内存,那么传递指针的地址(指向指针的指针)&pStruct1
,这样你的指针就会指向右边存储器中。