คอมไพเลอร์กรอกค่าchar array[100] = {0};
อย่างไร เวทย์มนตร์ที่อยู่เบื้องหลังมันคืออะไร?
ฉันอยากรู้ว่าคอมไพเลอร์เริ่มต้นอย่างไร
คอมไพเลอร์กรอกค่าchar array[100] = {0};
อย่างไร เวทย์มนตร์ที่อยู่เบื้องหลังมันคืออะไร?
ฉันอยากรู้ว่าคอมไพเลอร์เริ่มต้นอย่างไร
คำตอบ:
มันไม่ใช่เวทมนตร์
พฤติกรรมของรหัสนี้ใน C อธิบายไว้ในส่วนที่ 6.7.8.21 ของข้อมูลจำเพาะ C ( แบบร่างออนไลน์ของข้อมูลจำเพาะ C ): สำหรับองค์ประกอบที่ไม่มีค่าที่ระบุคอมไพเลอร์จะเริ่มต้นตัวชี้เป็น NULL และประเภทคณิตศาสตร์เป็นศูนย์ ( และนำสิ่งนี้ไปใช้ซ้ำกับการรวมซ้ำ)
พฤติกรรมของรหัสนี้ใน C ++ อธิบายไว้ในส่วนที่ 8.5.1.7 ของข้อกำหนด C ++ ( แบบร่างออนไลน์ของข้อมูลจำเพาะ C ++ ): คอมไพเลอร์สรุปรวม - เริ่มต้นองค์ประกอบที่ไม่มีค่าที่ระบุ
นอกจากนี้โปรดทราบว่าใน C ++ (แต่ไม่ใช่ C) คุณสามารถใช้รายการ initializer ว่างได้ทำให้คอมไพเลอร์รวมการเริ่มต้นองค์ประกอบทั้งหมดของอาร์เรย์:
char array[100] = {};
สำหรับโค้ดประเภทใดที่คอมไพเลอร์อาจสร้างขึ้นเมื่อคุณทำสิ่งนี้ให้ดูที่คำถามนี้: แอสเซมบลีที่แปลกจากอาร์เรย์ 0-initialization
การใช้งานขึ้นอยู่กับนักพัฒนาคอมไพเลอร์
หากคำถามของคุณคือ "สิ่งที่จะเกิดขึ้นกับการประกาศดังกล่าว" - คอมไพเลอร์จะตั้งค่าองค์ประกอบอาร์เรย์แรกเป็นค่าที่คุณระบุ (0) และอื่น ๆ ทั้งหมดจะถูกตั้งค่าเป็นศูนย์เพราะเป็นค่าเริ่มต้นสำหรับองค์ประกอบอาร์เรย์ที่ละเว้น
หากคอมไพเลอร์ของคุณคือ GCC คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
int array[256] = {[0 ... 255] = 0};
โปรดดูที่ http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Initsและโปรดทราบว่านี่เป็นคุณลักษณะเฉพาะของคอมไพเลอร์
ขึ้นอยู่กับตำแหน่งที่คุณวางการเริ่มต้นนี้
ถ้าอาร์เรย์คงที่เช่นเดียวกับใน
char array[100] = {0};
int main(void)
{
...
}
ดังนั้นจึงเป็นคอมไพเลอร์ที่สำรอง 100 0 ไบต์ใน data segement ของโปรแกรม ในกรณีนี้คุณอาจละเว้นผู้เริ่มต้น
หากอาร์เรย์ของคุณเป็นแบบอัตโนมัติแสดงว่าเป็นอีกเรื่องหนึ่ง
int foo(void)
{
char array[100] = {0};
...
}
ในกรณีนี้ทุกฟังก์ชั่นการโทร foo คุณจะมี memset ที่ซ่อนอยู่
รหัสข้างต้นเทียบเท่ากับ
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
และถ้าคุณไม่ใช้ initializer อาร์เรย์ของคุณจะมีข้อมูลแบบสุ่ม (ข้อมูลของสแต็ก)
หากอาร์เรย์ในเครื่องของคุณถูกประกาศคงที่เช่นเดียวกับใน
int foo(void)
{
static char array[100] = {0};
...
}
ในทางเทคนิคแล้วมันเป็นกรณีเดียวกับกรณีแรก