不带头结点的链栈获取长度错误

#include<stdio.h>
#include<stdlib.h>

typedef struct StackNode{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

int initStack(LinkStack s){
    s = NULL;
    return 0;
}

int getLength(LinkStack s){
    int n = 0;
    LinkStack p = s;
    while(p){
        n++;
        p = p->next;
    }
    return n;
}

int push(LinkStack s,int e){
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    if(!p){
        return -1;
    }
    p->data = e;
    p->next = s;
    s = p;
    printf("元素%d进栈!\n",e);
    return 0;
}

int pop(LinkStack s,int e){
    if(!s){
        return -1;
    }
    LinkStack p = s;
    e = p->data;
    s = s->next;
    free(p);
    printf("元素%d出栈!\n",e);

}

int emptyStack(LinkStack s){
    if(s){
        printf("链栈不为空!\n");
        return 1;
    }else{
        printf("链栈为空!\n");
        return 0;
    }
}

int getTop(LinkStack s){
    if(!s){
        return -1;
    }
    return s->data;
}

int clearStack(LinkStack s){
    if(!s){
        return -1;
    }
    LinkStack q;
    while(s){
        q = s;
        s = s->next;
        free(q);
    }
    return 0;
}

int destroyStack(LinkStack s){
    if(!s){
        return -1;
    }
    LinkStack q;
    while(s){
        q = s;
        s = s->next;
        free(q);
    }
    return 0;
}

int main(){
    int initStatus;
    int popElem;
    LinkStack s;
    // 初始化
    initStatus = initStack(s);
    if(initStatus == 0){
        printf("init successful!\n");
    }else{
        printf("init failure!\n");
    }
    // 长度 判空
    printf("length: %d\n",getLength(s));
    emptyStack(s);
}
```c

请问各位朋友,这个main方法中执行getLength函数总是卡在while上,不知道什么原因,请各位朋友指教一下。

修改见注释,供参考:

#include<stdio.h>
#include<stdlib.h>

typedef struct StackNode{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

int initStack(LinkStack* s){ //修改
    (*s) = NULL;             //修改
    return 0;
}

int getLength(LinkStack s){
    int n = 0;
    LinkStack p = s;
    while(p){
        n++;
        p = p->next;
    }
    return n;
}

int push(LinkStack* s,int e){ //修改
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    if(!p){
        return -1;
    }
    p->data = e;
    p->next = (*s);        //修改
    (*s) = p;              //修改
    printf("元素%d进栈!\n",e);
    return 0;
}

int pop(LinkStack* s,int* e){ //修改
    if(!s){
        return -1;
    }
    LinkStack p = (*s);
    *e = p->data;         //修改
    (*s) =  p->next;      //修改
    free(p);
    printf("元素%d出栈!\n",*e);
    return 0;
}
 
int emptyStack(LinkStack s){
    if(s){
        printf("链栈不为空!\n");
        return 1;
    }else{
        printf("链栈为空!\n");
        return 0;
    }
}
 
int getTop(LinkStack s){
    if(!s){
        return -1;
    }
    return s->data;
}
 
int clearStack(LinkStack* s){ //修改
    if(!(*s)){                //修改
        return -1;
    }
    LinkStack q;
    while((*s)){              //修改
        q = (*s);             //修改
        (*s) = q->next;       //修改
        free(q);
    }
    return 0;
}
 
int destroyStack(LinkStack* s){  //修改
    if(!(*s)){                   //修改
        return -1;
    }
    LinkStack q;
    while((*s)){                 //修改
        q = (*s);                //修改
        (*s) = q->next;          //修改
        free(q);
    }
    return 0;
}

int main(){
    int initStatus;
    int popElem;
    LinkStack s;
    // 初始化
    initStatus = initStack(&s); //修改
    if(initStatus == 0){
        printf("init successful!\n");
    }else{
        printf("init failure!\n");
    }
    push(&s,1);
    push(&s,2);
    // 长度 判空
    printf("length: %d\n",getLength(s));
    emptyStack(s);

    printf("\n");

    pop(&s,&popElem);
    pop(&s,&popElem);
    //clearStack(&s);
    //destroyStack(&s);
    printf("length: %d\n",getLength(s));
    emptyStack(s);

    return 0;
}