C语言中,所有的指针都必须进行初始化,包括结构体中的成员!

代码如下:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4.    
  5. struct student{   
  6.   char *name;   
  7.   int score;   
  8.   struct student* next;   
  9. }stu,*stu1;    
  10.    
  11. int main(){    
  12.   stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/   
  13.   strcpy(stu.name,"Jimy");   
  14.   stu.score = 99;   
  15.    
  16.   stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/   
  17.   stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/   
  18.   stu.next  = stu1;   
  19.   strcpy(stu1->name,"Lucy");   
  20.   stu1->score = 98;   
  21.   stu1->next = NULL;   
  22.   printf("name %s, score %d \n ",stu.name, stu.score);   
  23.   printf("name %s, score %d \n ",stu1->name, stu1->score);   
  24.   free(stu1);   
  25.   return 0;   
  26. }   

    二叉树遍历算法中所用的左子树和右子树指针不需要初始化,其实是这样的,左子树和右子树指向的必须是二叉数节点类型的结构体指针(你填一个长度相同的指针也可以),而该结构体指针是需要初始化的(见注释2),也就是并没有通过malloc来分配内存,而是将另一个指针的值赋给它  

   顿时觉得挺无语的,确实,看了很多大学里的教材,对于二叉树的遍历等算法定义的结构体无非是以下形式 

  1. struct node{   
  2.   int data;   
  3.   struct node* lchild, rchild;   
  4. };  

使用时都直接的

  1. struct node* root;   
  2. root = (struct node*)malloc(sizeof(struct node));   
  3. root->data = 3;   
  4.    
  5. struct node* nlchild;   
  6. nlchild = (struct node*)malloc(sizeof(struct node));   
  7. root->lchild = nlchild;   
  8. nlchild->data = 2;    
  9.    
  10. struct node* nrchild;   
  11. nlrchild = (struct node*)malloc(sizeof(struct node));   
  12. root->rchild = nrchild;   
  13. nrchild->data = 4;  

这样子给人造成一种错觉好像结构体成员指针是不用初始化的。 
可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据!
C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制一切;如果你觉得烦躁,你正不得不控制一切。

  1. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/   

这一句可能会有人把sizeof里边也填成struct student* 
可以理解这样的行为,因为stu本来就是struct student*,可是这样子你就没有为结构体分配足够的内存,使用中会因为内存错误同样报错的。 
当然,仅仅为结构体指针分配内存还不够,结构体成员指针仍然需要分配内存,如下 

  1. stu1->name = (char*)malloc(sizeof(char));