char *buf为什么会导致fgets(buf, 50, f)失败?而改为char buf[50]就能成功?

调试时的部分代码如下:

char *buf;
int main(){
    FILE* f;
    if (f = fopen("D:\\BookIdx.txt", "r")) {
            while (!feof(f))
                GetLine(f);
    }
    fclose(f);
}
void GetLine(FILE* f) {
    fgets(buf, 50, f);
}

出现的问题是:
图片说明
当我修改buf定义为char buf[50];此问题就消失了,这是什么原因?

char *buf;
光有指针,没有分配空间

要么你写

char *buf;
int main(){
    FILE* f;
        buf = (char *)malloc(sizeof(char) * 100);
        ...