为什么第二和第三种方法可以编译成功但是运行会崩溃

1.
#include <stdio.h>

typedef struct {
int data;
} a;

void fun(a *t) {
t->data = t->data + 1;
}

int main() {
a t;
t.data = 1;
fun(&t);
printf("%d", t.data);
}

2.
#include <stdio.h>

typedef struct {
int data;
} *a;

void fun(a t) {
t->data = t->data + 1;
}

int main() {
a t;
t->data = 1;
fun(t);
printf("%d", t->data);
}
3.
#include <stdio.h>

typedef struct {
int data;
} a;

void fun(a *t) {
t->data = t->data + 1;
}

int main() {
a *t;
t->data = 1;
fun(t);
printf("%d", t->data);
}

2和3是因为结构体指针 t 没有合法空间,使用malloc动态分配空间就可以了
2.
#include <stdio.h>
#include <stdlib.h>
typedef struct stu{
int data;
} *a;
void fun(a t)
{
t->data = t->data + 1;
}
int main() {
a t=malloc(sizeof(struct stu));//动态分配空间
t->data = 1;
fun(t);
printf("%d", t->data);
free(t);//释放空间
}
3.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
} a;

void fun(a *t) {
t->data = t->data + 1;
}
int main() {
a *t=malloc(sizeof(a));//动态分配空间
t->data = 1;
fun(t);
printf("%d", t->data);
free(t);//释放空间
}