c - 如何修改已传递给 C 函数的指针?

标签 c function pointers parameters pass-by-value

所以,我有一些代码,类似于下面的代码,用于将结构添加到结构列表中:

void barPush(BarList * list,Bar * bar)
{
    // if there is no move to add, then we are done
    if (bar == NULL) return;//EMPTY_LIST;

    // allocate space for the new node
    BarList * newNode = malloc(sizeof(BarList));

    // assign the right values
    newNode->val = bar;
    newNode->nextBar = list;

    // and set list to be equal to the new head of the list
    list = newNode; // This line works, but list only changes inside of this function
}

这些结构定义如下:

typedef struct Bar
{
    // this isn't too important
} Bar;

#define EMPTY_LIST NULL

typedef struct BarList
{
    Bar * val;
    struct  BarList * nextBar;
} BarList;

然后在另一个文件中我执行如下操作:

BarList * l;

l = EMPTY_LIST;
barPush(l,&b1); // b1 and b2 are just Bar's
barPush(l,&b2);

但是,在此之后,l仍然指向EMPTY_LIST,而不是barPush内部创建的修改版本。如果我想修改它,我是否必须将列表作为指向指针的指针传递,或者是否需要其他一些黑暗咒语?

最佳答案

如果你想这样做,你需要传递一个指针到一个指针。

void barPush(BarList ** list,Bar * bar)
{
    if (list == NULL) return; // need to pass in the pointer to your pointer to your list.

    // if there is no move to add, then we are done
    if (bar == NULL) return;

    // allocate space for the new node
    BarList * newNode = malloc(sizeof(BarList));

    // assign the right values
    newNode->val = bar;
    newNode->nextBar = *list;

    // and set the contents of the pointer to the pointer to the head of the list 
    // (ie: the pointer the the head of the list) to the new node.
    *list = newNode; 
}

然后像这样使用它:

BarList * l;

l = EMPTY_LIST;
barPush(&l,&b1); // b1 and b2 are just Bar's
barPush(&l,&b2);

Jonathan Leffler 建议在评论中返回新的列表头:

BarList *barPush(BarList *list,Bar *bar)
{
    // if there is no move to add, then we are done - return unmodified list.
    if (bar == NULL) return list;  

    // allocate space for the new node
    BarList * newNode = malloc(sizeof(BarList));

    // assign the right values
    newNode->val = bar;
    newNode->nextBar = list;

    // return the new head of the list.
    return newNode; 
}

用法变为:

BarList * l;

l = EMPTY_LIST;
l = barPush(l,&b1); // b1 and b2 are just Bar's
l = barPush(l,&b2);

关于c - 如何修改已传递给 C 函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277872/

相关文章:

c++ - C C++ - TCP 套接字类 : Receive Problem

c - 编写一个递归函数来计算数组中的元音

Java等价于iif函数

c - 使用 fgets 将数据读入未初始化的 char 指针变量会在第二次读取时崩溃

objective-c - 星号 * 在 Objective-C 中是什么意思?

c - Linux 中重写 malloc、free 和 calloc 会导致递归

c - 使用C语言进行Linux网络编程

c - 如何检测客户端内部的pclose

c++ - (c++) 将随机值从 main 保存到函数数组

c - 赋值从指针生成整数而不进行强制转换 [-Wint-conversion