【问题标题】:returning a pointer and modifying what that pointer points to返回一个指针并修改该指针指向的内容
【发布时间】:2013-10-28 14:01:19
【问题描述】:

我在一个函数中有一个指针,我想返回该指针,以便稍后修改它指向的内容。返回它会返回指针指向的地址还是指针本身?这个问题是因为我想更改链表的头部指向的内容。

例如

struct node_{
    //variables
}*headPtr=NULL; //assume when we are returning headPtr in foo() it is no longer NULL but points to something

typdef struct node_ node;

node foo(){
    //some if conditions
    return headPtr;
}

main(){
    node *tmpPtr;
    tmpPtr=foo();
}

【问题讨论】:

  • 您在//some if conditions 中获得了什么?我想你需要使用malloc()

标签: c pointers memory linked-list


【解决方案1】:

这个函数接受一个指向链表头部的指针,一些其他参数,创建一个新节点并将列表附加到它并返回新的头部。

 struct type *ptr_change_head(struct type *ptr_old_head, other args){
  struct type *ptr = ptr_old_head;
  struct type *ptr_new_head = <new head>;

  ptr_new_head->ptr_next = ptr;

  return ptr_new_head;

}

【讨论】:

  • 我建议不要使用新指针返回值,原因是向 调用者 传达错误条件受到严格限制(并且始终存在至少一个漏洞)。例如:假设您在使用 ptr 之前修复了此代码以检查 NULL,您可能会返回 NULL 并希望调用者保存原始传递的指针以避免泄漏)。不幸的是,这种情况并不少见,事实上,正是由于这个原因,一个常用的标准函数 (realloc()) 经常被错误地使用。尽管如此,这确实解决了 OP 的问题。
【解决方案2】:

首先,让我们匹配您的类型。 foo() 的类型签名说它返回一个node,但您实际上是在尝试返回一个指向node 的指针。让我们将foo()重新定义为

node *foo() {
    return headPtr;
}

返回它会返回指针指向的地址还是指针本身?

线

tmpPtr = foo();

会将指针指向的地址放入变量tmpPtr,而tmpPtr 将是另一个与headPtr 完全匹配的变量。也就是说,指向同一事物的两个独立的指针。这里有两点需要说明:

  • tmpPtrheadPtr 是两个独立的变量,如果重新分配一个变量,另一个变量将没有影响。
  • 由于它们当前指向同一个节点,您可以通过解除对任一指针的引用来改变它们指向的节点,假设它们指向一个实际节点而不是NULL

如果您的意图是更改 headPtr 指向的内容,您可以:

  • 直接将headPtr 更改为headPtr = something 之类的赋值。
  • 设置指向headPtr 的指针,类型为node**

你可以设置一个指向headPtr的指针

node **foo() {
    return &headPtr;
}

int main() {
    node **headPtrPtr = foo();
    *headPtrPtr = something else;
}

这将在headPtrPtr 中放置一个指向headPtr 的指针。通过取消引用headPtrPtr,您可以使headPtr 指向一个新节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多