使用了指针,但是函数的形参仍然无法传递给实参

这是个顺序表,自定义的函数MakeEmpty(SqList *S)对顺序表进行初始化,但是初始化后的S的形参的值length=0,无法传递给实参。请问是为什么啊,然后怎么在这个函数内部能让形参传递给实参呢?

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

#define MAXSIZE 27/*存储空间初始分配量*/
typedef int ElemType;/*ElemType类型根据实际情况而定,这里假设为int*/

typedef struct
{/*线性表的顺序存储结构*/
    ElemType data[MAXSIZE];/*数组存储数据元素*/
    int length;/*线性表的当前长度*/
}SqList;

void MakeEmpty(SqList *S)
{/*初始化顺序表*/
    S = (SqList *)malloc(sizeof(SqList));
    S->length = 1;
}

int main(void)
{
    SqList Sa;MakeEmpty(&Sa);
    SqList Sb;MakeEmpty(&Sb);
    SqList Sc;MakeEmpty(&Sc);

    return 0;
}

测试效果
运行时,形参的值是改变了的
图片说明

但是这个形参s的length值却没有传递个实参
图片说明

问题出在 S = (SqList *)malloc(sizeof(SqList));这条语句要删除。
实参&Sa在子函数中被malloc修改为S,返回后S不存在,当然也修改不了length。
值传递,地址传递,实际上都是值传递。