C语言如何用malloc动态创建对象?指针使用技巧详解
鏄笉鏄粡甯搁亣鍒扮▼搴忚窇鐫€璺戠潃灏卞崱鎴愮嫍浜嗭紵鎴栬€呰帿鍚嶅叾濡欏氨宕╂簝浜嗭紵鎴戣窡浣犺鍟婏紝鍏垚鏄唴瀛樼鐞嗗湪浣滃锛佷粖澶╁氨甯︿綘浠妸杩欑帺鎰忓効鏁存槑鐧斤紝淇濊瘉浣犵湅瀹屽氨鑳戒笂鎵嬮€犲璞★紝鍐嶄篃涓嶅綋鎸囬拡灏忕櫧锛?/p>
鈥?strong>鈥嬩负鍟ュ瓙闈炶鐢╩alloc锛熺洿鎺ュ畾涔夊彉閲忎笉棣欏悧锛熲€?/strong>鈥?br/> 鍝庡懄鍠傦紝闂緱濂斤紒姣斿浣犺鍋氫釜瀛︾敓绠$悊绯荤粺锛屼粖澶?0浜烘槑澶?00浜猴紝浣犳€讳笉鑳藉ぉ澶╂敼浠g爜鍚э紵杩欐椂鍊檓alloc灏辨淳涓婄敤鍦轰簡锛屾兂瑕佸灏戝唴瀛樼洿鎺ュ紑鍙h锛屽氨璺熻嚜鍔╅浼肩殑锛屽悆澶氬皯鎷垮灏戯紒
涓句釜鏍楀瓙馃尠锛?br/> 浼犵粺鍐欐硶锛?code>Student classA[100]; // 涓囦竴鏉ヤ簡101涓鐢熷氨瀹岀妸瀛?br/> malloc鍐欐硶锛?code>Student* students = malloc(n * sizeof(Student)); // 鎯宠澶氬皯濉灏戞暟
浠庨浂寮€濮嬬殑malloc鍥涙澶ф硶
鈥?strong>鈥嬬涓€姝ワ細寮€鍙h閽扁€?/strong>鈥?/p>
c澶嶅埗int* p = (int*)malloc(sizeof(int)); // 瑕佷釜int澶у皬鐨勭┖闂?/span>
娉ㄦ剰鐪嬭繖涓猻izeof鍟婏紒寰堝鏂版墜鍦ㄨ繖閲岀炕杞︼紝璁颁綇鈥?strong>鈥嬬被鍨嬪ぇ灏忓啓閿欑洿鎺ュ噳鍑夆€?/strong>鈥嬶紒
鈥?strong>鈥嬬浜屾锛氶獙閽炵幆鑺傗€?/strong>鈥?/p>
c澶嶅埗if(p == NULL) { printf("绯荤粺绌峰緱鍙綋鍝嶄簡锛?); exit(1); // 璧剁揣鎾ら€€淇濆钩瀹?/span> }
杩欐鍗冧竾鍒渷锛佸氨璺熺綉璐笉楠岃揣浼肩殑锛屽埌鏃跺€欑敤鐫€鐢ㄧ潃宕╀簡鍝兘娌″湴鍎垮摥锛?/p>
鈥?strong>鈥嬬涓夋锛氳淇柊鎴库€?/strong>鈥?/p>
c澶嶅埗*p = 666; // 缁欐柊瀹舵惉瀹跺叿 memset(p, 0, sizeof(int)); // 鎴栬€呯洿鎺ュぇ鎵櫎娓呴浂
鈥?strong>鈥嬮噸瑕佹彁閱掆€?/strong>鈥嬶細malloc鎷垮埌鐨勫唴瀛樺氨鍍忔瘺鍧埧锛岄噷澶村彲鑳芥湁鍓嶄换鐣欎笅鐨勫瀮鍦炬暟鎹紒
鈥?strong>鈥嬬鍥涙锛氶€€鎴挎墜缁€?/strong>鈥?/p>
c澶嶅埗free(p); // 鐢ㄥ畬璁板緱閫€鎴?/span> p = NULL; // 閽ュ寵浜ゅ洖闃插皬鍋?/span>
璁颁綇鍟婏紝涓峟ree鐨勮瘽鍐呭瓨灏变細鍍忓繕璁板叧鐨勬按榫欏ご锛屽摋鍝楀湴婕忥紒
鎸囬拡鎿嶄綔鐨勪笁澶х蹇?/h3>
- 鈥?strong>鈥嬮噹鎸囬拡涔辩獪鈥?/strong>鈥嬶紙鎸囩潃宸查噴鏀剧殑鍐呭瓨锛?/li>
c澶嶅埗free(p);
printf("%d", *p); // 浣滄琛屼负锛?/span>
- 鈥?strong>鈥嬪唴瀛樿秺鐣岄€涜鈥?/strong>鈥?/li>
c澶嶅埗int* arr = malloc(5*sizeof(int));
arr[5] = 123; // 璇村ソ鍙5闂存埧锛屽亸瑕佷綇绗?闂?/span>
- 鈥?strong>鈥嬮噸澶嶉噴鏀惧ぇ绀煎寘鈥?/strong>鈥?/li>
c澶嶅埗free(p);
free(p); // 鍙屾潃锛佺郴缁熺洿鎺ラ€佷綘涓穿婧冨ぇ绀煎寘
楂樻墜閮藉湪鐢ㄧ殑鎸囬拡绉樼睄
free(p);
printf("%d", *p); // 浣滄琛屼负锛?/span>
int* arr = malloc(5*sizeof(int));
arr[5] = 123; // 璇村ソ鍙5闂存埧锛屽亸瑕佷綇绗?闂?/span>
free(p);
free(p); // 鍙屾潃锛佺郴缁熺洿鎺ラ€佷綘涓穿婧冨ぇ绀煎寘
鈥?strong>鈥嬬绫嶄竴锛氫簩绾ф寚閽堝鐢ㄢ€?/strong>鈥?br/> 鎯虫敼鎸囬拡鏈韩锛熷緱鐢ㄦ寚閽堢殑鎸囬拡锛?/p>
c澶嶅埗void create(int** pp) { *pp = malloc(sizeof(int)); **pp = 888; }
鈥?strong>鈥嬬绫嶄簩锛歝onst鎶や綋澶ф硶鈥?/strong>鈥?/p>
c澶嶅埗const int* p1; // 鏁版嵁涓嶅彲鏀?/span> int* const p2; // 鎸囬拡涓嶅彲鏀?/span>
杩欎釜缁勫悎鎷虫墦鍑烘潵锛屽濡堝啀涔熶笉鐢ㄦ媴蹇冩垜鎵嬫粦鏀归敊鏁版嵁鍟︼紒
鈥?strong>鈥嬬绫嶄笁锛氬嚱鏁板皝瑁呮湳鈥?/strong>鈥?br/> 鑷繁鍐欎釜鍒涘缓鍑芥暟锛屾瘮鐩存帴瑁哥敤malloc瀹夊叏澶氫簡锛?/p>
c澶嶅埗Student* create_student() { Student* s = malloc(sizeof(Student)); if(s) { s->age = 18; // 榛樿鍊艰蛋璧?/span> s->score = 60; } return s; }
鍐呭瓨绠$悊宸ュ叿澶ф瘮鎷?/h3>
宸ュ叿 | 浼樼偣 | 缂虹偣 |
---|---|---|
malloc/free | 鐏垫椿鍙帶 | 瀹规槗缈昏溅 |
鍐呭瓨姹?/td> | 閫熷害蹇崯鑰楀皬 | 瀹炵幇澶嶆潅 |
鏅鸿兘鎸囬拡(C++) | 鑷姩绠$悊 | C璇█鐢ㄤ笉浜嗗晩浜诧紒 |
鍨冨溇鍥炴敹鍣?/td> | 鐪佸績鐪佸姏 | 鎬ц兘鎹熻€楀ぇ |
瑕佹垜璇村晩锛屾寚閽堣繖鐜╂剰鍎垮氨璺熼獞鑷杞︿技鐨勶紝鍒氬紑濮嬫垬鎴樺參鍏紝鐔熺粌浜嗗氨鑳界帺鍑鸿姳鏉ャ€傚鍐欏缁冩墠鏄帇閬擄紝閬囧埌鎶ラ敊鍒厡锛屼粩缁嗙湅鐪嬪摢姝ユ搷浣滆秺鐣屼簡锛屽唴瀛樻硠婕忎簡銆傝浣忥紝姣忎釜free閮借鏈夊搴旂殑malloc锛屽氨鍍忔瘡娈垫劅鎯呴兘瑕佹湁濮嬫湁缁堝槢锛佹渶鍚庨€佷綘涓彛璇€锛氣€?strong>鈥嬪厛鐢宠锛屽悗浣跨敤锛岀敤瀹岃寰楄繕鍥炲幓鈥?/strong>鈥嬶紝淇濈浣犲啓鍑哄仴澹鐗涚殑绋嬪簭锛?/p>
本文由嘻道妙招独家原创,未经允许,严禁转载