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 ไม่เท่ากันนะครับ

10 คิดบน “calloc VS. malloc

  1. @jayz ได้แบบนั้นก็ดีล่ะครับ

    แต่ต้องระวังกรณีที่ OS ให้ memory ตำแหน่งที่มีค่าไม่เป็น 0 มานะครับ
    เพราะถ้าโปรแกรมเรา assume ว่า malloc จะให้ผลลัพธ์แบบนี้โปรแกรมจะรันผิดได้ครับ

  2. งงครับ สุดท้ายจบด้วย overhead ไม่เท่ากัน
    แล้วอันไหนมากกว่า น้อยกว่ายังไง แล้วมีผลต่างขนาดไหนอ่ะคับ

    ความเห็นผมว่า มันจบห้วนไปนิดนึงครับ สำหรับคนมือใหม่อย่างผม >_<

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s