標籤:style blog color 使用 資料 2014 ar size
前幾天用的結構體,結構體內還包含有結構體指標和數組以及指向字串的指標,發現自己對這方面的東西還很容易犯錯,故現在講其中容易出錯的地方寫出來,分享給大家也方便自己日後查看。
typedef struct {char name[50];char job[50];int age;int people_id;} peopleInfo;typedef struct {bool typeAdd;bool typeDel;int length;peopleInfo *info;char buildDate[64];char lastDate[64];char valueStr[256];} peopleObj;
上面就是兩個結構體,peopleObj結構體中包含有上一個結構體的指標和一些數組(開始我在這裡不是用的數組,而是用的指標,如char *lastDate, char * valueStr,為什麼最後改為數組,最後再討論)
peopleObj* meGlobal;
如果有上面的指標定義,一定要為指標申請記憶體,在這裡我使用
meGlobal= (peopleObj *)malloc(sizeof(peopleObj));這裡的記憶體申請使用c標準庫的malloc申請。char為1個位元組,int為4個位元組,指標info為4個位元組,所以不算是那兩個bool類型的,共為256+64+64+4+4=392個位元組。bool類型的c++沒有規格為多大,自己可以查下資料,4版的c++ primer上是沒有規定的,估計和編譯器有關。
這裡特別注意在申請記憶體的時候只為peopleInfo *info;中的info指標申請了4位元組的記憶體,peopleInfo結構體中的變數沒有記憶體,如果需要使用則須為它們申請記憶體,如:
meGlobal->info = (peopleInfo *)malloc(sizeof(peopleInfo)*10);這樣就可以使用info下的變數了,不會報錯。
現在講下為什麼後來改使用數組:
開始我是這樣定義結構體的:
typedef struct {char *name;char *job;int age;int people_id;} peopleInfo;typedef struct {bool typeAdd;bool typeDel;int length;peopleInfo *info;char *buildDate;char *lastDate;char *valueStr;} peopleObj;
在結構體內,有很多資料我事先是不確定的,故開始我使用指標指向字串。
同上面一樣,在開始初始化meGlobal= (peopleObj *)malloc(sizeof(peopleObj));時,只為那些指標申請了記憶體,指標指向的內容並沒有記憶體,故我又使用:
meGlobal->info->job = (char *)malloc(sizeof(char)*50);
meGlobal->info->name = (char *)malloc(sizeof(char)*50);
meGlobal->buildDate=(char *)malloc(sizeof(char)*64);
meGlobal->lastDate=(char *)malloc(sizeof(char)*64);
meGlobal->valueStr=(char *)malloc(sizeof(char)*256);
對於上面的記憶體申請都是估計的最大,所以存在很多的記憶體浪費,這裡先不討論。但是若是要使用必須做類似的申請記憶體,否則指標指向的內容沒有記憶體空間。在後面的程式處理中,如果用到了上面的指標如果指向了其他記憶體,一定要注意其他記憶體在某段程式中是否被釋放,如果被釋放,那開始使用的指標就是野指標沒有指向,如果你沒有注意到這點,當又把指標直接拿去用就會出現崩潰,所以要在做它用之前為他申請記憶體或讓它指向一段記憶體,這樣才不會出錯。
對於指標的使用一定要謹慎,我就是嫌麻煩而且開始出錯了,故選用數組。當數組開始定義的時候就有一段記憶體就被分配給它了。
關於指標和數組,c++ primer現在都不推薦,推薦盡量使用vector容器和迭代器代替。指標還有很多很複雜的用途,慢慢學習吧。
如果有錯還請指出,相互學習。