gpt4 book ai didi

c - 在 C 中动态构建二叉树时指针分配的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:58 28 4
gpt4 key购买 nike

学了几个月的C,在动态构建二叉树时指针的使用遇到了一些困难:

给出我的代码如下:

typedef struct TNoeud
{
int data;
struct TNoeud *pFilsGauche;
struct TNoeud *pFilsDroit;
} TNoeud;


void insereData(int data, TNoeud **pRacine)
{
TNoeud *noeud=malloc(sizeof(TNoeud));

noeud->data=data;
noeud->pFilsDroit=NULL;
noeud->pFilsGauche=NULL;

while((*pRacine)!=NULL)
{
if(data<(*pRacine)->data)
{
pRacine=&(**pRacine).pFilsGauche;
}
else
{
pRacine=&(**pRacine).pFilsDroit;
}
}
if(pRacine==NULL)
{
*pRacine=noeud;
}
free(noeud);
}

主要是:

int main(int argc, const char * argv[]) {

TNoeud *pRacine=malloc(sizeof(TNoeud));

pRacine->data=0;
pRacine->pFilsGauche=NULL;
pRacine->pFilsDroit=NULL;

pRacine=&noeudRacine;

insereData(4, &pRacine);

return 0;
}

我阅读了以下主题 https://stackoverflow.com/a/28637104/7866010对于 BAD_ACCESS,但在我的例子中,指针不为 NULL,因为 pRacine 被分配为 0。

我阅读了以下主题 https://stackoverflow.com/a/15154553/7866010 , 但它没有帮助。

我也试过声明变体

(*pRacine)->data

在本主题中找到 https://stackoverflow.com/a/346739/7866010没有任何区别。

所以我的问题是:

  • [已解决,将 TNoeud noeud 作为指针而不是局部变量。我也以同样的方式在 main 中更改了 pRacine] 为什么要指针

    *pRacine == NULL

    当我传递一个指向指定值的指针作为参数时

    insereData(4, &pRacine) ?
  • [以同样的方式解决] 为什么调试器给我指针的随机值

    [1] = 0x00007fff5fbff700)

    和数据

    (int) data = 1606416544)

    我不是心甘情愿的分配吗?

  • [已解决:通过删除 if(pRacine==NULL) 条件并将其替换为 (*pRacine)=noeud;] 现在不再错误,但结果是

    insereData(4, &pRacine);

    不影响 pRacine:应该是

    pRacine->pFilsDroit->data==4

    但这里它仍然是 NULL。我不明白为什么,因为它不再是局部变量。

谢谢大家的回答!

最佳答案

一些建议(不是法律)。
首先,为了不让自己对指针感到困惑,只需将它们作为数组来使用。它确实有效,不会让您感到困惑。
例如给定指针 int* ptr,用于访问第一个元素的是 ptr[0]

问题就在这里

if(pRacine==NULL)
{
*pRacine=&noeud;
}

因为 noeud 不在动态内存中,所以它会停止。
您只需将 noeud 定义为 malloc 结构的指针。但为了便于内存,请在不需要时留意free

关于c - 在 C 中动态构建二叉树时指针分配的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43441736/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com