Prototype

ลองนั่งทำ C PUZZLES ดู แล้วติดที่ข้อนี้ ที่ให้อธิบายว่าโค้ดข้างล่างนี้จะ Segmentation Fault เมื่อคอมไพล์บน IA-64 แต่ทำงานถูกต้องบน IA-32

int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}

ปัญหาคือดันไม่มี IA-64 ให้เล่นอีก เลยต้องนั่งหาในเน็ตดูว่ามีเฉลยกันมั่งรึเปล่า แล้วก็เจอไม่ยาก จาก debian-list

เรื่องของเรื่องคือเมื่อคอมไพล์เลอร์ไม่พบ Prototype ของฟังก์ชั่น มันจะคิดเอาเองว่าฟังก์ชั่นจะคืนค่าเป็น int 32 เสมอ ในกรณีนี้ทำให้ core dump ได้ไม่ยาก วิธีแก้ก็ไม่มีอะไรเลย แค่ include ไฟล์ stdlib.h เข้าไปก็จะไม่มีปัญหาแล้ว

เขียน C มาเป็นปีๆ เรื่องพวกนี้ หลายๆ ครั้งก็แค่ตาม Best Practice ไปโดยไม่เข้าใจแฮะว่าทำไมต้อง include ให้ครบๆ

 

lewcpe

CTO at MFEC PLC. Chief Editor at Blognone.com

 

3 thoughts on “Prototype

  1. เพราะ function ที่ไม่ได้เขียนใน code (กรณีนี้คือ malloc)
    เวลาไม่ include มันไม่รู้ prototype จึงคืนค่าเป็น int 32
    เข้าใจว่า เวลา load malloc ใน standard library จะ return เป็น 64 bit
    เลย Segmention Fault เพราะใน executable file ที่ run มันเห็นว่า prototype เป็น 32 bit

  2. กำลังคิดว่าทำไมมันไม่ default ให้ return int64
    เพราะใน ANSI ก็ไม่ได้กำหนดขนาด int ไว้หนิ

    ส่วนโจทย์ข้อนี้ ผมนั่งไล่ขนาด pointer, var กับการ malloc
    แต่ไม่ได้คิดถึงเรื่อง return value เล้ยย จริงๆ ซิเนี่ย ลืมไปได้ – -“

  3. iPAtS – ใน IA-64 โดยส่วนมากแล้ว int จะเป็น 32 บิตนะครับ (เข้าใจว่าขึ้นกับ Compiler)

Comments are closed.