日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

再识C中的结构体

發(fā)布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再识C中的结构体 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  在前面認識C中的結(jié)構(gòu)體中我介紹了結(jié)構(gòu)體的基礎(chǔ)知識,下面通過這段代碼來回顧一下:

 1 #include<stdio.h>
 2 #define LEN 20
 3 
 4 struct Student{            //定義結(jié)構(gòu)體
 5     char name[LEN];
 6     char address[LEN];
 7     int age;
 8 };
 9 
10 int main(int argc, char* argv[])
11 {
12     struct Student s = {        //初始化
13         "bluemsun","NENU",25
14     };    
15     
16     struct Student * p;            //定義一個指向結(jié)構(gòu)體的指針
17     p = &s;                        //為指針賦值
18 
19     printf("s.name = %s,s.address = %s,s.age = %d\n",s.name,s.address,s.age);
20     printf("p->name = %s,p->address = %s,p->age = %d\n",p->name,p->address,p->age);    
21 }

  這是一個比較簡單的例子程序,在結(jié)構(gòu)體Student中我們定義兩個char數(shù)組,現(xiàn)在來考慮這樣一個問題。我們在平時需要使用數(shù)組的時候都是可以用指針代替數(shù)組作為參數(shù)使用,那么在上面的程序中能否用下面這段代碼代替結(jié)構(gòu)體的定義呢?

1 struct new_Student{            //定義結(jié)構(gòu)體
2     char * name;
3     char * address;
4     int age;
5 };

  答案是肯定的,但是可能會遇到一些麻煩。考慮下面一段代碼:

1 struct new_Student s1 = {"zhouxy","EFGH",25};    
2 struct Student s2 = {"bluemsun","ABCD",26};    

  這段代碼是正確的。但是想想其中的字符串存儲在哪里?對于struct Student變量s2來說,字符串存儲在結(jié)構(gòu)內(nèi)部,這個結(jié)構(gòu)總共分配了40個字節(jié)來存儲兩個字符串。然而對于new_Student變量s1來說,字符串是存放在編譯器存儲字符串常量的任何地方。new_Student結(jié)構(gòu)中僅僅是存放了兩個地址而已。所以如果需要一個結(jié)構(gòu)來存放字符串,請使用字符數(shù)組成員。那么是不是采用指針的方式就真的不能完成內(nèi)存的分配呢?答案是否定的。在這里我講解了關(guān)于C中的函數(shù)malloc(),這個函數(shù)是可以在運行期動態(tài)分配內(nèi)存的。所以如果能結(jié)合在這里來使用,那就達到了我們的設(shè)想了。考慮下面這段代碼:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 struct new_Student{            //定義結(jié)構(gòu)體
 6     char * name;
 7     char * address;
 8     int age;
 9 };
10 
11 int main(int argc, char* argv[])
12 {
13     char str[] = "zhouxy";
14     struct new_Student s1;    
15     //分配用來存放名字的內(nèi)存
16     s1.name = (char*)malloc(strlen(str)+1);
17     //把名字復制到已分配的內(nèi)存中
18     strcpy(s1.name,str);
19     
20     printf("s1.name = %s\n",s1.name);
21 }

  上面代碼是正確的,我們用malloc()函數(shù)分配存儲空間,然后把字符串復制到新分配的空間。這里要理解的是:name字符串不是被存儲在結(jié)構(gòu)中,而是被保存在由malloc()函數(shù)管理的內(nèi)存中。結(jié)構(gòu)中僅僅是保存了name字符串的地址而已。還有一點要記得的是:我們使用malloc()函數(shù)分配內(nèi)存之后要調(diào)用free()函數(shù),不然可能會引起"內(nèi)存泄露"。

轉(zhuǎn)載于:https://www.cnblogs.com/zhouxuanyu/p/4514754.html

總結(jié)

以上是生活随笔為你收集整理的再识C中的结构体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。