gpt4 book ai didi

c - 指针参数损坏: returning the pointer or passing address of pointer works

转载 作者:行者123 更新时间:2023-11-30 18:03:15 25 4
gpt4 key购买 nike

我将指向用户定义类型的指针传递给 malloc 内存的函数,并将该指针设置为指向它。 malloc() 返回一个指针,但是当我从函数返回时,我的指针被破坏了。我想出了一些解决办法:

  • 返回指针而不是传递它
  • 传递指针的地址而不是指针本身

我怀疑这与 FILE 指针的情况类似;如果将指针传递给函数,则不能指望指针不会更改,因为系统可能会对其进行修改。因此,您改为传递 FILE * 的地址。

有人对此有解释吗?这是代码(抱歉,有点长):

typedef struct  {
BOOK *bookAry;
int numBooks;
}INVENTORY;

我在 main() 中有这个,其中 INVENTORY 是用户定义的类型,如上所述:

//variable declarations
INVENTORY *inv = NULL;

//process
initInventory( inv, bookArySize );
processFile( inv );

initInventory()函数如下:

void initInventory( INVENTORY *inv, int size ) {

//process
inv = ( INVENTORY * ) malloc( sizeof( INVENTORY ) );
//more code here....
return;

}//initInventory

因此,我们返回到 main() (我们认为),inv 指向新分配的内存(并且 inv 指向具有其他指针的结构)。仅当我将指针 inv 传递给 processFile() 时,它才会被破坏,并且当我尝试引用 inventory 结构中的数据时,我收到访问冲突。事实证明,返回 main() 时指针无效!

这修复了它:main() 有:

//variable declarations
INVENTORY *inv = NULL;

//process
inv = initInventory( inv, bookArySize );
processFile( inv );

initInventory()更改为:

INVENTORY * initInventory( INVENTORY *inv, int size ) {

//process
inv = ( INVENTORY * ) malloc( sizeof( INVENTORY ) );


//return a pointer to the INVENTORY header struct
return inv;

}//initInventory

然后我尝试了这个,我认为这是一个更好的解决方案。 main() 现在有:

//variable declarations
INVENTORY *inv = NULL;
//more code here...

//process
initInventory( &inv, bookArySize );
processFile( inv );

initInventory()如下:

void initInventory( INVENTORY **inv, int size ) {

//process
*inv = ( INVENTORY * ) malloc( sizeof( INVENTORY ) );
//more code here....
return;

}//initInventory

最佳答案

基本上,如果按值传递指针,它将被复制到参数中,并且被调用函数无法更改调用者指针 - malloc() 分配给传递的参数 OK,但是对副本的这种更改是从函数返回时丢失 - *INV 保持 NULL。显式返回指针或通过引用传入指针 (**) 都可以 - malloc() 返回的指针被加载到调用者变量中,因此返回后调用者可以成功取消引用。

这与 FILE 指针有同样的问题。如果您打算在被调用函数内部打开文件并在返回后在调用方中访问它,则不能按值传入 FILE*。

关于c - 指针参数损坏: returning the pointer or passing address of pointer works,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com