結構體指標記憶體——指標陣列——字串指標記憶體申請
前幾天用的結構體,結構體內還包含有結構體指標和陣列以及指向字串的指標,發現自己對這方面的東西還很容易犯錯,故現在講其中容易出錯的地方寫出來,分享給大家也方便自己日後檢視。
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容器和迭代器代替。指標還有很多很複雜的用途,慢慢學習吧。
如果有錯還請指出,相互學習。