calloc VS. malloc
นั่งเรียนเขียนโปรแกรมภาษาซี มาก็หลายอาจารย์ หลายรอบ แต่วันนี้เพิ่งจะรู้ว่าฟังก์ชัน calloc กับ malloc ต่างกันยังไง ตอนเรียน อ.ก็บอกว่า ทั้งสองฟังก์ชันทำหน้าที่จองหน่วยความจำให้ตามที่เรากำหนด แต่วิธีเรียกใช้ต่างกันนิดหน่อย
malloc(ขนาดหน่วยความจำเป็นไบต์); |
calloc(หน่วยความจำกี่ช่อง, ช่องละกี่ไบต์) |
เกิดอาการสงสัยอย่างแรง ว่าไหนๆ มันก็ทำงานได้เหมือนๆ กันแล้ว ทำไมต้องมีตั้งสองฟังก์ชัน พอไปเปิด man ดูก็เจอข้อแตกต่างว่า malloc จะจองพื้นที่ให้ แล้วก็จบแค่นั้น แต่ calloc จะจองพื้นที่ให้และกำหนดค่าเริ่มต้นเป็น 0 ด้วย
ลองดูโค้ดและผลลัพธ์ของโปรแกรม น่าจะช่วยให้เข้าใจง่ายขึ้นครับ
#include<stdio.h> #include<stdlib.h> int main() { int *a = (int*) malloc(sizeof(int)*10); int *b = (int*) calloc(10, sizeof(int)); int i; for(i=0;i<10;i++) { printf("a = %d, b = %d\n", a[i], b[i]); } return 0; } |
ผลลัพธ์: a = 3221200, b = 0 a = 3215048, b = 0 a = 1095651909, b = 0 a = 1346192717, b = 0 a = 1095910725, b = 0 a = 1196314448, b = 0 a = 1866661971, b = 0 a = 1701860205, b = 0 a = 977485155, b = 0 a = 1852397404, b = 0 |
ดังนั้นควรเลือกฟังก์ชันให้เหมาะสมกับการใช้งาน เพราะมี overhead ไม่เท่ากันนะครับ
ปกติ ใช้ แต่ malloc แฮะ
[Reply]
อ้าว แมวเลย วันก่อนเพิ่งใช้ calloc แล้วไปไล่กำหนดค่าให้เป็น 0 ทุกอันอีก 555
[Reply]
โอ้ว กะลังงง มาอ่านแล้วเก็ดเลย
[Reply]
มัวป่าวเนี้ย ประกาศ void แต่มี return ด้วย
[Reply]
@Comment โอ้… ขอบคุณครับ แต่ลอง compile มันก็ผ่านนะ… แค่ warning นิดหน่อยว่า “‘return’ with a value, in function returning void”
[Reply]
ผมรันบน UNIX ได้ดังนี้ครับ
ผลลัพธ์:
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
[Reply]
@jayz ได้แบบนั้นก็ดีล่ะครับ
แต่ต้องระวังกรณีที่ OS ให้ memory ตำแหน่งที่มีค่าไม่เป็น 0 มานะครับ
เพราะถ้าโปรแกรมเรา assume ว่า malloc จะให้ผลลัพธ์แบบนี้โปรแกรมจะรันผิดได้ครับ
[Reply]