結構體指標記憶體——指標數組——字串指標記憶體申請

來源:互聯網
上載者:User

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

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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.