0Pricing
C Academy · บทเรียน

calloc และ realloc

หน่วยความจำที่ล้างค่าแล้วและปรับขนาดได้

calloc และ realloc เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

นอกเหนือจาก malloc

นอกจาก malloc แล้ว ไลบรารีมาตรฐานยังมี calloc สำหรับหน่วยความจำที่ตั้งค่าเป็นศูนย์ และ realloc สำหรับปรับขนาดบล็อกที่มีอยู่

ทั้งสองฟังก์ชันอยู่ใน <stdlib.h>

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

calloc ตั้งค่าหน่วยความจำเป็นศูนย์

calloc(count, size) จองพื้นที่สำหรับองค์ประกอบจำนวน count รายการ โดยแต่ละรายการมีขนาด size ไบต์ และตั้งค่าไบต์ทุกตัวเป็น ศูนย์

วิธีนี้สะดวกเมื่อต้องการหน่วยความจำที่เริ่มต้นใหม่ทั้งหมด

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

calloc มีอาร์กิวเมนต์สองรายการ

ต่างจาก malloc ตรงที่ calloc รับจำนวนองค์ประกอบและขนาดขององค์ประกอบแยกจากกัน

นอกจากนี้ยังป้องกันค่าล้นขณะคูณจำนวนองค์ประกอบกับขนาด

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

malloc เทียบกับ calloc

ใช้ malloc เมื่อคุณจะเขียนทับทุกไบต์อยู่แล้ว และใช้ calloc เมื่อคุณต้องการให้หน่วยความจำเริ่มต้นด้วยค่าศูนย์

calloc ใช้เวลามากกว่าเล็กน้อยเนื่องจากต้องตั้งค่าเป็นศูนย์

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

การขยายด้วย realloc

realloc(ptr, newsize) เปลี่ยนขนาดของบล็อก โดยคงเนื้อหาเดิมไว้จนถึงขนาดที่น้อยกว่าระหว่างขนาดเก่ากับขนาดใหม่

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

realloc อาจย้ายบล็อก

realloc อาจคืนค่า แอดเดรสอื่น หากต้องย้ายบล็อกเพื่อหาพื้นที่ว่าง

กำหนดผลลัพธ์กลับให้ตัวชี้เสมอ และอย่าใช้ตัวชี้เดิมต่อ

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

รูปแบบการใช้ realloc อย่างปลอดภัย

หาก realloc ล้มเหลว จะคืนค่า NULL แต่บล็อกเดิมยังคงอยู่

กำหนดผลลัพธ์ให้ตัวแปรชั่วคราวก่อน เพื่อไม่ให้สูญเสียตัวชี้เดิมเมื่อเกิดความล้มเหลว

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

การลดขนาดบล็อก

realloc สามารถทำให้บล็อกมีขนาดเล็กลงได้เช่นกัน องค์ประกอบด้านหน้าจะยังคงอยู่ ส่วนที่เหลือจะถูกคืนหน่วยความจำ

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

บัฟเฟอร์ที่ขยายได้

รูปแบบที่ใช้บ่อยคือเพิ่มความจุเป็นสองเท่าเมื่ออาร์เรย์เต็ม เพื่อเฉลี่ยต้นทุนของการขยายออกไป

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

realloc กับ NULL

realloc(NULL, size) ทำงานเหมือนกับ malloc(size) ทุกประการ

จึงทำให้ฟังก์ชันขยายสามารถจัดการการจองครั้งแรกได้ด้วยรูปแบบเดียวกัน

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

การใช้ร่วมกัน

คุณสามารถเริ่มด้วย calloc เพื่อสร้างบัฟเฟอร์ที่เป็นศูนย์ แล้วขยายภายหลังด้วย realloc ไบต์ใหม่หลังการขยายจะ ไม่ ถูกตั้งค่าเป็นศูนย์

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

ตรวจสอบความเข้าใจ

ทดสอบความรู้เกี่ยวกับ calloc และ realloc ของคุณ

ทบทวน

คุณได้เรียนรู้เครื่องมือสำหรับการจองหน่วยความจำเพิ่มเติมอีกสองอย่าง:

  • calloc(count, size) จองหน่วยความจำที่ตั้งค่าเป็นศูนย์ และป้องกันค่าล้นจากการคูณ
  • realloc(ptr, newsize) ปรับขนาดบล็อก และอาจย้ายบล็อกนั้น
  • กำหนดผลลัพธ์ของ realloc ให้ตัวแปรชั่วคราวเสมอ เพื่อป้องกันหน่วยความจำรั่วเมื่อเกิดความล้มเหลว
  • realloc(NULL, size) ทำงานเหมือน malloc

คำถามที่พบบ่อย

บทเรียน “calloc และ realloc” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “calloc และ realloc” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “calloc และ realloc”

หน่วยความจำที่ล้างค่าแล้วและปรับขนาดได้ คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “calloc และ realloc” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. malloc และ free
  2. calloc และ realloc
  3. หน่วยความจำรั่ว
  4. พอยน์เตอร์ลอย
← กลับไปที่ C Academy