定义结构体指针变量时,只分配存储指针类型需要的空间,比如ListNode *p;这里p有给他分配存储指针的4个字节的空间。
实际上你是要让p指向一个结构体空间的,这个结构体空间在哪?
可以先定义ListNode a;
然后 p=&a;
这时p指向一个之前申请分配过空间(编译器设定过其地址和大小,在栈空间存放着了)。
现在我们要让p指向一个临时决定分配的空间(我们需要用来存储输入信息或计算信息),并让p指向他,使得之后我们随时通过p来访问他。于是使用malloc先分配内存,并把malloc返回的地址赋值给p。在这里,我们不能使用定义临时结构体变量并让p之前他(就如上面所说的p=&a),因为在子函数定义的变量,他们都是分配在子函数被调用时为其创建的栈空间,子函数退出时这些空间被释放回收,我们定义的变量生命结束,他们所在地址会被其他子函数被调用时创建栈空间所重用,那些地址很可能被新函数使用并修改所存数据。这是我们不敢想象的,为了数据安全,必须使用malloc分配内存,因为malloc分配的内存是在堆空间分配,只有使用free后,其内存才会释放,才能被其他地方重新分配。