再识C中的结构体
在前面認(rèn)識(shí)C中的結(jié)構(gòu)體中我介紹了結(jié)構(gòu)體的基礎(chǔ)知識(shí),下面通過這段代碼來回顧一下:
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; //定義一個(gè)指向結(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 }
這是一個(gè)比較簡(jiǎn)單的例子程序,在結(jié)構(gòu)體Student中我們定義兩個(gè)char數(shù)組,現(xiàn)在來考慮這樣一個(gè)問題。我們?cè)谄綍r(shí)需要使用數(shù)組的時(shí)候都是可以用指針代替數(shù)組作為參數(shù)使用,那么在上面的程序中能否用下面這段代碼代替結(jié)構(gòu)體的定義呢?
1 struct new_Student{ //定義結(jié)構(gòu)體 2 char * name; 3 char * address; 4 int age; 5 };
答案是肯定的,但是可能會(huì)遇到一些麻煩。考慮下面一段代碼:
1 struct new_Student s1 = {"zhouxy","EFGH",25}; 2 struct Student s2 = {"bluemsun","ABCD",26};
這段代碼是正確的。但是想想其中的字符串存儲(chǔ)在哪里?對(duì)于struct Student變量s2來說,字符串存儲(chǔ)在結(jié)構(gòu)內(nèi)部,這個(gè)結(jié)構(gòu)總共分配了40個(gè)字節(jié)來存儲(chǔ)兩個(gè)字符串。然而對(duì)于new_Student變量s1來說,字符串是存放在編譯器存儲(chǔ)字符串常量的任何地方。new_Student結(jié)構(gòu)中僅僅是存放了兩個(gè)地址而已。所以如果需要一個(gè)結(jié)構(gòu)來存放字符串,請(qǐng)使用字符數(shù)組成員。那么是不是采用指針的方式就真的不能完成內(nèi)存的分配呢?答案是否定的。在這里我講解了關(guān)于C中的函數(shù)malloc(),這個(gè)函數(shù)是可以在運(yùn)行期動(dòng)態(tài)分配內(nèi)存的。所以如果能結(jié)合在這里來使用,那就達(dá)到了我們的設(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 //把名字復(fù)制到已分配的內(nèi)存中 18 strcpy(s1.name,str); 19 20 printf("s1.name = %s\n",s1.name); 21 }
上面代碼是正確的,我們用malloc()函數(shù)分配存儲(chǔ)空間,然后把字符串復(fù)制到新分配的空間。這里要理解的是:name字符串不是被存儲(chǔ)在結(jié)構(gòu)中,而是被保存在由malloc()函數(shù)管理的內(nèi)存中。結(jié)構(gòu)中僅僅是保存了name字符串的地址而已。還有一點(diǎn)要記得的是:我們使用malloc()函數(shù)分配內(nèi)存之后要調(diào)用free()函數(shù),不然可能會(huì)引起"內(nèi)存泄露"。
轉(zhuǎn)載于:https://www.cnblogs.com/zhouxuanyu/p/4514754.html
總結(jié)
- 上一篇: 黄山风景区有存包的地方吗
- 下一篇: 让兄妹互相友爱的电影如:小鞋子