C语言中,很多时候,使用指针会减少很多代码,使得写出来的代码比较明朗,但是,便捷性也会带来很多的麻烦,一不小心就会增加很多的检查代码的工作量。

    我觉得,在使用指针的时候,首先要记得一个原则:初始化

    所有指针在使用之前必须要初始化,如:

 
  
  1. char*  pfile = NULL;  
  2. int*  age = NULL;  
  3. struct Node *pNode = NULL;  

下面的代码是有问题:

 
  
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.  
  4. #define NUM 2 
  5. struct Student 
  6.   int age; 
  7.   int stu_num; 
  8.   char *name; 
  9.   char *addr; 
  10. }; 
  11.  
  12.  
  13. struct Student *stu[NUM] = {NULL}; 
  14.  
  15. int main() 
  16.   int i=0; 
  17.   int count=1; 
  18.  
  19.   for(i=0;i<NUM;i++) 
  20.   { 
  21.     stu[i]=(struct Student *)malloc(sizeof(struct Student)); 
  22.  
  23.  
  24.     if(stu[i] == NULL) 
  25.     { 
  26.       printf("Can't malloc memory for stu[%d]\n",i); 
  27.       exit(12); 
  28.     } 
  29.     printf("The stu[%d] address is %p\n",i,stu[i]); 
  30.  
  31.     printf("Input the %d student information\n",count); 
  32.  
  33.     printf("age: "); 
  34.     scanf("%d",&stu[i]->age); 
  35.  
  36.     printf("\nstudent id: "); 
  37.     scanf("%d",&stu[i]->stu_num); 
  38.  
  39.     printf("\nstudent name: "); 
  40.     scanf("%s",stu[i]->name); 
  41.  
  42.     printf("\nstudent address: "); 
  43.     scanf("%s",stu[i]->addr); 
  44.  
  45.     count++; 
  46.   } 
  47.  
  48.   while(i<2) 
  49.   { 
  50.     free(stu[i]); 
  51.     i++; 
  52.   } 
  53.  
  54.   return 0; 

编译上面的代码是没有报错和警告的(FreeBSD 9.0上GCC),但正是因为这样,在运行编译出来的程序会报错,会在哪里报错呢?看下面的截图:

是当输入name的时候,程序就自动退出了,检查程序,发现name是一个结构体的成员,而且是个指针成员,但在程序任何一处地方,没发现有对结构体指针成员初始化的工作,所以,可以判断是由于指针未初始化就使用引起的程序错误,对指针初始化如下:

 
  
  1. stu[i]->name=(char *)malloc(sizeof(char)); 

最后的完整、正确的代码如下:

 
  
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.  
  4. #define NUM 2 
  5. struct Student 
  6.   int age; 
  7.   int stu_num; 
  8.   char *name; 
  9.   char *addr; 
  10. }; 
  11.  
  12.  
  13. struct Student *stu[NUM] = {NULL}; 
  14.  
  15. int main() 
  16.   int i=0; 
  17.   int count=1; 
  18.  
  19.   for(i=0;i<NUM;i++) 
  20.   { 
  21.     stu[i]=(struct Student *)malloc(sizeof(struct Student)); 
  22.     stu[i]->name=(char *)malloc(sizeof(char)); 
  23.     stu[i]->addr=(char *)malloc(sizeof(char)); 
  24.  
  25.     if(stu[i] == NULL) 
  26.     { 
  27.       printf("Can't malloc memory for stu[%d]\n",i); 
  28.       exit(12); 
  29.     } 
  30.     printf("The stu[%d] address is %p\n",i,stu[i]); 
  31.  
  32.     printf("Input the %d student information\n",count); 
  33.  
  34.     printf("age: "); 
  35.     scanf("%d",&stu[i]->age); 
  36.  
  37.     printf("\nstudent id: "); 
  38.     scanf("%d",&stu[i]->stu_num); 
  39.  
  40.     printf("\nstudent name: "); 
  41.     scanf("%s",stu[i]->name); 
  42.  
  43.     printf("\nstudent address: "); 
  44.     scanf("%s",stu[i]->addr); 
  45.  
  46.     count++; 
  47.   } 
  48.  
  49.   while(i<2) 
  50.   { 
  51.     free(stu[i]); 
  52.     free(stu[i]->name); 
  53.     free(stu[i]->addr); 
  54.     i++; 
  55.   } 
  56.  
  57.   return 0; 

 到最后,别忘了把你申请的内存。