C 从指针访问结构成员

C 从指针访问结构成员,c,pointers,struct,C,Pointers,Struct,我对这段代码有一些分段错误的问题: void init(int max, pile * p) { p = (pile *)malloc(sizeof(pile)); if(p){ p->nbElemPresent = 0; p->maxElem = max; p->tete = (data *)malloc(max * sizeof(data)); } } short int

我对这段代码有一些分段错误的问题:

void init(int max, pile * p) {
    p = (pile *)malloc(sizeof(pile));
    if(p){
        p->nbElemPresent = 0;
        p->maxElem       = max;
        p->tete          = (data *)malloc(max * sizeof(data));
    }
}

short int vide(pile * p) {
    if(p->maxElem == 0) {return 1;}
    return 0;
}
我的功能返回给我SEGFULT。。我不知道如何从p指针访问struct成员

主要节目:

pile * p;
init(5, p);
printf("%d", vide(p));

ty.

正如巴拉克·马诺斯(barak manos)所说,你的问题在于初始化。C按值传递参数,让我们想象一下:

将一个指向pile的指针设置为NULL pile*p=NULL; 您将其传递给init initp; 在init中,您分配了一个堆并影响到p的本地副本 从init返回时,p仍然为NULL,并且由于不再有任何指向所分配堆的指针,因此存在内存泄漏 这就是你应该写的原因:

void init(int max, pile ** p) {
    pile *lp = *p = (pile *)malloc(sizeof(pile));
    if(*p){
        lp->nbElemPresent = 0;
        lp->maxElem       = max;
        lp->tete          = (data *)malloc(max * sizeof(data));
    }
}
现在您可以使用:

pile *p;
init(&p);

返回时,p指向分配的堆。

C按值获取参数,这意味着当您将指针p传递给init时,它会被复制。 函数中的p是一个全新的变量,如果其值发生变化,则不会改变传递给函数的p值

您应将其地址传递给:

init(5, &p);

void init(int max, pile** p) {
    *p = malloc(sizeof(pile));
    if(*p){
    (*p)->nbElemPresent = 0;
    ....
    }
}

注意不寻常的括号*p->nbElemPresent,之所以这样做是因为->运算符具有更高的优先级,但我们希望首先取消对p的引用。

正如前面所说,p是init函数中的一个新变量。除了建议的其他答案之外,我更愿意建议根本不要将p作为参数,而是返回它:

pile* init(int max) {
  pile *p = (pile *)malloc(sizeof(pile));
  ...
  return p;

}
在你的主要职能中:

pile * p = init(5);
printf("%d", vide(p));

如果seg错误发生在vide中,则传入的参数很可能为NULL。在访问该字段之前检查此项。在函数init中,在每次出现的p旁边添加一个*。无论在哪里调用函数init,在传递给该函数的第二个参数旁边添加一个&函数init无效。它没有做你想象它应该做的事情。是的,我认为是我的初始化函数没有完成他的工作。如果p为null,我不做任务,我会改变,看看它是否在这里。函数init的一个好原型是void initint max,pile**p。这是保持对已分配内存的访问、避免内存泄漏和分段错误所必需的。这不起作用,因为您没有更改的参数类型init@PhilippMurry啊!那是个打字错误。谢谢你指出这一点。