我在使用此代码时出现了一些分段错误问题:
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。
答案 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按值传递参数,让我们想象:
pile *p = NULL;
)init(p);
)这就是你应该写的原因:
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指向分配的桩。