从指针访问struct成员

时间:2014-11-20 17:57:59

标签: 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 vide(pile * p) {
    if(p->maxElem == 0) {return 1;}
    return 0;
}

我的函数vide返回我的段错误..我不知道如何从p指针访问struct成员。

主程序:

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

TY。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如前所述,p是init函数中的一个新变量。除了建议的其他答案之外,我宁愿建议不要将p作为参数,而是将其返回:

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

}

并在您的主要功能中:

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

答案 2 :(得分:0)

正如巴拉克马诺斯所说,你的问题在于init。 C按值传递参数,让我们想象:

  • 您将指针设置为NULL(pile *p = NULL;
  • 您将其传递给init(init(p);
  • 在初始化中你分配一堆,影响到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指向分配的桩。