使用此功能向我的树添加数据时遇到问题。 我正在使用代码块,当我运行我的程序时,它给了我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;
}
答案 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
(一个局部变量)指向已分配的内存。这不会影响test
中main
的值。
printf("%d",test->data);
test
仍为NULL
,您尝试取消引用它会导致段错误。