填写c中的二叉树函数

时间:2015-05-08 17:32:54

标签: c function tree

使用此功能向我的树添加数据时遇到问题。 我正在使用代码块,当我运行我的程序时,它给了我windows错误框

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

struct arb{
    int data;
    struct arb*FG;
    struct arb*FD;
};

void remplit(struct arb*r,int i)
{
    if (r==NULL)
    {
        r=malloc(sizeof(struct arb));
        r->data=i;
        r->FD=NULL;
        r->FG=NULL;
    }
    else
    {
        if (i>(r->data))
        {
            remplit(r->FD,i);
        }
        else
        {
            remplit(r->FG,i);
        }
    }
}

struct arb * test=NULL;

int main()
{
    remplit(test,5);
    printf("%d",test->data);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您将全局指针设置为NULL。然后,将指针按值传递给另一个使用malloc为其分配动态内存的函数。

问题是因为指针是按值传递的,所以全局值不变(仍然是NULL),因为指针的 copy 现在存储由分配的内存区域的地址您的全局指针malloc

现在,当你取消引用指针时(在调用remplit之后),它会给你一个段错误,因为test仍然是NULL。

如果要使用函数将内存分配给传递给它的指针,则需要使该函数采用双指针并将malloc的返回值赋给指针的取消引用。

作为一个简单示例,请考虑以下内容,使用双指针和执行分配的实用程序函数创建char数组

void create_char_array(char** p, int size)
{
    *p = NULL;
    *p = malloc(size * (sizeof char));
    /* *p now points to dynamically allocated memory */
}

int main()
{
    char* my_array;
    /* allocate memory for an array of 10 chars using above function
       by passing the address of my_array */
    create_char_array(&my_array,10);
    if (my_array != NULL)
    {
        /* you can now safely assign values to valid the indices in the array */
    }
    /* release memory */
    free (my_array);
    return 0;
}

如果您学习使用调试器,则可以在所有步骤中单步执行代码。您应该看到在函数内部,内存被分配给r指针(它是test的副本),但全局test指针的值仍为NULL。您的代码实际上有内存泄漏,因为当函数退出时,函数内部指针的副本将被销毁。内存已分配给它,但由于变量不再存在,因此无法释放它。

答案 1 :(得分:1)

您正在按值传递指针,而不是名称。

remplit(test,5);

这会将test发送给remplit

r=malloc(sizeof(struct arb));

这将r(一个局部变量)指向已分配的内存。这不会影响testmain的值。

printf("%d",test->data);

test仍为NULL,您尝试取消引用它会导致段错误。