C - 按引用调用

标签 c pointers data-structures segmentation-fault

我写了一个简单的程序来对数字的重复时间进行一个一个的排序,然后将它们一个一个地插入到树中。我的问题是,我无法插入 root 的 child ,因为我无法将下面的函数更改为按引用调用类型。

我认为下面的 q 参数需要保 stub 的地址值。

void insertNode(int data, node *q, node *parent){
    if(q == NULL){
        node *p = createNode(data);
        p -> parent = parent;
        p -> key = generateKey(p);
        int i;
        for(i = 0;table[i][1] != 0;i++);
        table[i][1] = p -> data;
        table[i][0] = p -> key;
        q = p;
    }
    else if(q -> left > q -> right || q -> left == q -> right){
        q -> right++;
        insertNode(data, q -> rightChild, q);
    }
    else if(q -> right > q -> left){
        q -> left++;
        insertNode(data, q -> leftChild, q);
    }
}

最佳答案

C 中没有“按引用传递”这样的东西。如果您需要为传递给函数的指针分配一个新值(不仅仅是改变指针指向的内容),您将需要传递一个指向指针的指针,即

void insertNode(int data, node **q, node *parent){
    /* code */
    *q = p;
}

当您在 C 中传递指针(或其他任何东西)时,您传递的是指针的副本。因此,您的函数的调用者可以看到这种类型的更改:

q->someVal = someOtherVal;

但这并不是因为您只是在修改传递给函数的副本:

q = p;

您需要添加另一个间接级别以修改参数本身,以使更改在函数外部可见。

关于C - 按引用调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378079/

相关文章:

javascript - 什么是重新排列项目的好算法和数据结构?

c++ - 如何使用 C 预处理器生成可变大小(取决于操作系统)的十六进制文字?

c - 使用正则表达式从字符串中分配变量

c - 两种类型的 C#define 之间的区别

c++ - 奇怪的指针错误 C++ MSVC6

mysql - stackoverflow 如何找到用户并向他们发送通知?

data-structures - FILO 总是 LIFO 吗?

c - C中的递归strstr函数

c - 如何安全地将 void* 转换为 C 中的 int?

C++指针指向函数指针的指针数组?任何线索如何去做?