1. 主页 > 好文章

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>
  1. 鈥?strong>鈥嬮噹鎸囬拡涔辩獪鈥?/strong>鈥嬶紙鎸囩潃宸查噴鏀剧殑鍐呭瓨锛?/li>
c澶嶅埗
free(p);
printf("%d", *p);  // 浣滄琛屼负锛?/span>
  1. 鈥?strong>鈥嬪唴瀛樿秺鐣岄€涜鈥?/strong>鈥?/li>
c澶嶅埗
int* arr = malloc(5*sizeof(int));
arr[5] = 123;  // 璇村ソ鍙5闂存埧锛屽亸瑕佷綇绗?闂?/span>
  1. 鈥?strong>鈥嬮噸澶嶉噴鏀惧ぇ绀煎寘鈥?/strong>鈥?/li>
c澶嶅埗
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>

本文由嘻道妙招独家原创,未经允许,严禁转载