1. 程式人生 > >結構體指標記憶體——指標陣列——字串指標記憶體申請

結構體指標記憶體——指標陣列——字串指標記憶體申請

前幾天用的結構體,結構體內還包含有結構體指標和陣列以及指向字串的指標,發現自己對這方面的東西還很容易犯錯,故現在講其中容易出錯的地方寫出來,分享給大家也方便自己日後檢視。

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容器和迭代器代替。指標還有很多很複雜的用途,慢慢學習吧。

如果有錯還請指出,相互學習。