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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- malloc และ free
- calloc และ realloc
- หน่วยความจำรั่ว
- พอยน์เตอร์ลอย