C语言的结构体指针变量问题

//单链表
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;

int main(){
bool InitList();
LinkList L;//指针
InitList(L);
printf("%d\n",L->data);
free(L);
return 0;
}

bool InitList(LinkList L){
//带头结点
L = (LNode *)malloc(sizeof(LNode));

if(L == NULL){
    printf("单链表初始化失败!\n");
    return false;
} 
else{
    printf("单链表初始化成功!\n");
    //test
    L->data = -1;//头结点存表长(data个数) 
    L->next = NULL;
    return true;
}

}

为什么在main里打印L->data的值在控制台没有反应?

函数中的L没有传回去,用返回值给main中的L赋值

1、函数定义最好不要在函数内定义,函数实现和定义的参数要一致
2、函数参数的值不可修改,你这函数InitList定义的时候没有参数,在实现的时候有参数L,L是指针,其值为指针地址,不可修改,所以L = (LNode *)malloc(sizeof(LNode));无效。在main函数中LinkList L;是初始化指针L,未向内存申请地址初始地址为野指针,但L != NULL,所以在函数InitList中走else,由于是野指针,所以对其属性赋值也就不准确了。
3、解决该问题可以有两种方法
方法一:在main函数中L向内存申请地址,在init函数中对其属性赋值。即将L = (LNode *)malloc(sizeof(LNode));写在main函数中
方法二:函数InitList的参数修改为(LinkList L),内部实现L更改为L,具体修改之后代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList *L);
int main(int argc, const char * argv[]) {
    LinkList L;//指针
    InitList(&L);
    printf("%d\n",L->data);
    free(L);
    return 0;
}

bool InitList(LinkList *L){
    //带头结点
    *L = (LNode *)malloc(sizeof(LNode));
    if(*L == NULL){
        printf("单链表初始化失败!\n");
        return false;
    }
    else{
        printf("单链表初始化成功!\n");
        //test
        (*L)->data = -1;//头结点存表长(data个数)
        (*L)->next = NULL;
        return true;
    }
}