新聞速報

        

2014年2月27日 星期四

pointer in struct

在struct裡面宣告了char *,結果只有重新malloc struct,卻沒注意到內部的char * 的問題。
 
在struct中的char *, 如果沒有每次重新malloc記憶體空間,僅會用4 bytes來紀錄address ,所以每個宣告出來的struct 都會使用到同一個記憶體空間 的char *。
 
底下是個簡單的使用struct來建立的link list範例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define SIZE 80
 
typedef struct _info{
   int  id;
   char * name;
   _info * Next;
}student_info;
 
typedef student_info * Info;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   Info Head, New, Point, Temp;
   char *str;
   int i;
 
   str = (char *)malloc(sizeof(char) * SIZE);
 
   for(i = 1; i < 4; i++){
     printf("Please input a string: ");    
     scanf("%s", str);
     if(i == 1){
       Head = (Info)malloc(sizeof(student_info));
       Head->id = i;
       //Head->name = str; //錯誤示範
       Head->name = (char *)malloc(sizeof(char) * (strlen(str) + 1)); //正確作法
       strcpy(Head->name, str);
       Head->Next = NULL;
       Point = Head;
     }else{
       New = (Info)malloc(sizeof(student_info));
       New->id = i;
       //New->name = str; //錯誤示範
       New->name = (char *)malloc(sizeof(char) * (strlen(str) + 1)); //正確作法
       strcpy(New->name, str);
       New->Next = NULL;
       Point->Next = New;
       Point = New;
     }
 
   }
   
   Point = Head;
 
   while(1){
     printf("ID = %d, Name = %s\n", Point->id, Point->name);
 
     if(Point->Next == NULL)
     {
       free(Point);
       break;
     }
     else
     {
       Temp = Point->Next;
       free(Point); 
       Point = Temp;
     }
   }
 
   return 0;
}

沒有留言:

張貼留言