ก่อนที่ผู้คนจะเริ่มทำเครื่องหมายสิ่งนี้ฉันได้อ่านสิ่งต่อไปนี้ทั้งหมดซึ่งไม่มีคำตอบใดที่ให้คำตอบที่ฉันกำลังมองหา:
- C คำถามที่พบบ่อย: การร่ายค่าตอบแทนของ malloc มีอะไรผิดปกติ?
- SO: ฉันควรโยนค่าตอบแทนของ malloc () อย่างชัดเจนหรือไม่
- SO: ตัวชี้ที่ไม่จำเป็นต้องร่ายใน C
- SO: ฉันสร้างผลลัพธ์ของ malloc หรือไม่?
ทั้งคำถามที่พบบ่อยเกี่ยวกับ C และคำตอบมากมายสำหรับคำถามข้างต้นกล่าวถึงข้อผิดพลาดที่ลึกลับซึ่งmalloc
ค่าส่งคืนของการหล่อสามารถซ่อนได้ อย่างไรก็ตามไม่มีคนใดให้ตัวอย่างเฉพาะของข้อผิดพลาดดังกล่าวในทางปฏิบัติ ตอนนี้ให้ความสนใจที่ผมกล่าวว่าข้อผิดพลาดไม่เตือน
ตอนนี้ได้รับรหัสต่อไปนี้:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
การคอมไพล์โค้ดด้านบนด้วย gcc 4.2 โดยมีและไม่มีการแคสต์จะให้คำเตือนเหมือนกันและโปรแกรมจะดำเนินการอย่างถูกต้องและให้ผลลัพธ์ที่เหมือนกันในทั้งสองกรณี
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
ใครก็ได้ช่วยยกตัวอย่างโค้ดเฉพาะของข้อผิดพลาดในการคอมไพล์หรือรันไทม์ที่อาจเกิดขึ้นเนื่องจากการแคmalloc
สต์ค่าส่งคืนหรือนี่เป็นเพียงตำนาน
แก้ไขฉันเจอข้อโต้แย้งที่เขียนได้ดีสองข้อเกี่ยวกับปัญหานี้:
- In Favor of Casting: CERT Advisory: ส่งผลลัพธ์ของการเรียกใช้ฟังก์ชันการจัดสรรหน่วยความจำทันทีเป็นตัวชี้ไปยังประเภทที่จัดสรร
- ต่อต้านการแคสต์ (ข้อผิดพลาด 404 ณ วันที่ 2012-02-14: ใช้สำเนาInternet Archive Wayback Machineจาก 2010-01-27 {2016-03-18: "ไม่สามารถรวบรวมข้อมูลหรือแสดงเพจได้เนื่องจาก robots.txt"})
void
ตัวชี้การหล่อช่วยให้สามารถรวบรวมรหัสเป็น C ++ บางคนบอกว่านั่นคือคุณสมบัติฉันว่ามันเป็นบั๊ก;)