โปรแกรมเมอร์ C ควรรู้อะไร [ปิด]


12

อะไรคือแนวคิด / เทคนิค / คุณสมบัติภาษาที่โปรแกรมเมอร์ C ที่ดีทุกคนควรรู้ / ระวัง (ไม่รวมวิศวกรรมซอฟต์แวร์ทั่วไปและลักษณะที่คล้ายกัน ฉันต้องการทราบเพื่อที่ฉันจะได้สามารถเติมเต็มช่องว่างที่เป็นไปได้ในความรู้ C ของฉัน


9
เริ่มต้นด้วยคำถาม Cของ Stack Overflow และดูว่ามีอะไรที่คุณไม่รู้หรือไม่
chrisaycock

3
โปรแกรมเมอร์ AC น่าจะรู้ว่า2 + 2 = 4
Edward Strange

21
พวกเขาควรรู้ร้านที่ขายรองเท้ากันกระสุน
Adam Crossland

1
มีหนังสือหลายร้อยเล่มที่เขียนในเรื่องนี้ คำถามของคุณค่อนข้างคลุมเครือ คุณจะต้องเจาะจงมากขึ้นเพื่อให้ได้คำตอบที่ดีซึ่งไม่ใช่แค่รายการสิ่งของ และเห็นคำตอบที่ gengerated จนถึงคำถามนี้ฉันคิดว่ามันจะต้องมีการทำใหม่หรือปิด
วอลเตอร์

2
ภาษาโปรแกรมอื่นหรือไม่
Muhammad Alkarouri

คำตอบ:


19

เฉพาะ C? นอกเหนือจากการสร้างมาตรฐานทั่วไปภาษาขั้นตอนส่วนใหญ่ฉันต้องพูดว่า:

  • (ab) โดยใช้ตัวประมวลผลล่วงหน้า
  • linker vs คอมไพเลอร์
  • พอยน์เตอร์พอยน์เตอร์พอยน์เตอร์!
  • วิธีการที่ตัวชี้เป็นอาร์เรย์
  • การทำงานของสตริง C และวิธีการที่เป็นพอยน์เตอร์และอาร์เรย์
  • การใช้สตริง C ไม่ดีอาจส่งผลให้บัฟเฟอร์ล้น
  • ทำอย่างไรจึงจะโยนทุกอย่างให้ได้ (เพียง 1 วินาทีและ 0 วินาทีหลังจากทั้งหมด :))
  • การจัดการหน่วยความจำด้วยตนเอง malloc / ฟรี
  • Stack vs Heap
  • นามแฝงของตัวชี้ (สาเหตุที่ผิดกฎหมายใน C99)
  • คิดเกี่ยวกับการพัฒนาในแง่ของโมดูล (ไฟล์. h / .c) ด้วยชุดของฟังก์ชั่นที่เปิดเผยต่อสาธารณะแทนที่จะเป็นคลาสที่เข้มงวด
  • ยูเนี่ยน
  • ทำไม sprintf สามารถพัดเท้าของคุณออก
  • พอยน์เตอร์ฟังก์ชั่น

ฉันจะเพิ่ม "buffer overflows" ในรายการ
Aidan Cully

@idan จับดี ที่เพิ่ม
Doug T.

2
วิธีอาร์เรย์และตัวชี้ C แตกต่างกันอย่างไร: books.google.ca/…
Matthieu

ตัวชี้ควรได้รับการทำซ้ำอย่างน้อย 3 ครั้ง
Gaurav

8

ทำความเข้าใจกับพอยน์เตอร์และคุณจะเข้าใจคอมพิวเตอร์


12
ไม่คุณจะได้รับภาพลวงตาที่คุณเข้าใจคอมพิวเตอร์
งาน

5

นอกจากคำตอบที่ยอดเยี่ยมของ pythagras แล้ว

วิธีการเขียน (หรืออย่างน้อยอ่าน) การประกาศที่ซับซ้อนเช่น char (*(*funcs[4])())[10]

funcs คืออาร์เรย์ [4] ของพอยน์เตอร์ไปยังฟังก์ชันที่ส่งคืนพอยน์เตอร์ไปยังอาร์เรย์ [10] ของถ่าน


1
ถ้ามันซับซ้อนมากบางทีนี่อาจเป็นความคิดเห็นใช่ไหม
งาน

7
บางทีเขาควรเรียนรู้วิธีหลีกเลี่ยงการเขียนแบบนั้น?
FabianB

3
  1. กฎการเลื่อนระดับจำนวนเต็ม
  2. เริ่มต้นทุกอย่างเป็นค่าที่รู้จัก
  3. GOTO ไม่ใช่สิ่งที่ชั่วร้ายโดยเฉพาะเมื่อใช้เพื่อจัดการข้อยกเว้น / ความล้มเหลว
  4. malloc และ / หรือ calloc สามารถส่งคืนค่า NULL ... ตรวจสอบให้แน่ใจว่าค่าส่งคืนเช็คของคุณ
  5. การจัดสรรหน่วยความจำขนาดเล็กเป็นประจำอาจทำให้เกิดการแตกแฟรกเมนต์บนฮีป
  6. เลขคณิตของตัวชี้
  7. Bit Mask เป็นเพื่อนของคุณ
  8. x >> 1 เท่ากับ x / 2 สำหรับจำนวนเต็มที่ไม่ได้ลงนาม

+1 สำหรับ GOTO ไม่ใช่ความชั่วร้าย :)
zvrba

2

โปรแกรมเมอร์ AC ควรรู้ ... ภาษาอื่น ๆ ! ;-) การรู้แนวคิดจากภาษาอื่น ๆ ในกระบวนทัศน์ที่หลากหลายเช่น OOP การเขียนโปรแกรมที่ใช้งานได้และอื่น ๆ

อย่างจริงจังยิ่งขึ้นการดูการประกวดการเขียนโปรแกรมที่สับสนนั้นสนุกและอยากรู้อยากเห็นเป็นประสบการณ์ที่ดีเช่นกัน


2

ฉันพูดถึง "buffer overflows" ในความคิดเห็นต่อคำตอบของ Pythagras ฉันอาจจะอธิบายสิ่งที่ฉันหมายถึงเล็กน้อย ใน C ไม่เพียงพอที่จะรู้ว่าการทำงานกับหน่วยความจำโดยตรงนั้นเป็นอันตราย - คุณควรเข้าใจวิธีการที่แม่นยำซึ่งเป็นอันตราย ฉันไม่ชอบคำอุปมา "ยิงตัวเองในเท้า" สำหรับทุกกรณี - หลายครั้งคุณไม่ได้เหนี่ยวไก แต่บ่อยครั้งที่มันเป็นนักแสดงที่มีความสนใจตรงข้ามกับคุณและ / หรือผู้ใช้ของคุณ .

ตัวอย่างเช่นในสถาปัตยกรรมที่มีสแต็กจากมากไปน้อย (สถาปัตยกรรมที่นิยมมากที่สุดพอดีกับบิลนี้ - x86 และ ARM โดยทั่วไปรวมอยู่) เมื่อคุณเรียกใช้ฟังก์ชันที่อยู่ผู้ส่งคืนสำหรับฟังก์ชันจะถูกวางไว้บนสแต็กหลังจากตัวแปรท้องถิ่นที่กำหนดไว้ใน ร่างกายของฟังก์ชั่น ดังนั้นหากคุณประกาศบัฟเฟอร์เป็นตัวแปรท้องถิ่นและเปิดเผยตัวแปรนั้นกับโลกภายนอกโดยไม่ตรวจสอบบัฟเฟอร์ล้นเช่นนี้

void myFn(void) {
    char buf[256];
    gets(buf);
}

ผู้ใช้ภายนอกสามารถส่งสตริงที่เขียนทับที่อยู่ผู้ส่งคืนจากสแต็ก - โดยทั่วไปเขาสามารถเปลี่ยนแนวคิดการเรียกใช้เวลาทำงานของโปรแกรมของคุณสำหรับกราฟการโทรที่นำไปสู่ฟังก์ชันปัจจุบัน ดังนั้นผู้ใช้จะให้สตริงที่เป็นตัวแทนไบนารีของโค้ดที่ประมวลผลได้บางอย่างสำหรับสถาปัตยกรรมของคุณ, การขยายตัวมากพอที่จะล้นสแต็คจากmyFn, และข้อมูลเพิ่มเติมบางอย่างเพื่อเขียนทับที่อยู่ผู้ส่งกลับสำหรับmyFnชี้ไปที่รหัสที่เขามอบให้คุณ หากสิ่งนี้เกิดขึ้นเมื่อmyFnปกติแล้วจะส่งคืนการควบคุมไปยังผู้เรียกมันจะเปลี่ยนเป็นรหัสที่ผู้ใช้ประสงค์ร้ายให้แทน หากคุณเขียนรหัส C (หรือ C ++) ที่มีศักยภาพที่จะเปิดเผยต่อผู้ใช้ที่ไม่น่าเชื่อถือคุณต้องเข้าใจเวกเตอร์การโจมตีนี้. คุณควรเข้าใจว่าเหตุใดบัฟเฟอร์ล้นกับสแต็กมักจะใช้ประโยชน์ได้ง่ายกว่ากองกับกองซ้อนและคุณควรเข้าใจว่าหน่วยความจำในกองวาง (ไม่ได้อยู่ในรายละเอียดมากเกินไปจำเป็น แต่ แนวคิดที่ว่าmalloc()ภูมิภาค 'ed มีโครงสร้างการควบคุมโดยรอบสามารถช่วยให้เข้าใจได้ว่าเหตุใดโปรแกรมของคุณจึงล้มเหลวในอีกmalloc()หรือในfree())

C ทำให้คุณมีรายละเอียดในระดับต่ำเกี่ยวกับการทำงานของเครื่องและช่วยให้คุณสามารถควบคุมเครื่องของคุณได้โดยตรงมากกว่าภาษาที่ผู้ใช้แก้ไขอื่น ๆ ที่ใช้กันอย่างแพร่หลายในปัจจุบัน ด้วยพลังอันยิ่งใหญ่มาพร้อมความรับผิดชอบที่ยิ่งใหญ่ - คุณต้องเข้าใจรายละเอียดในระดับต่ำจริง ๆ เพื่อที่จะทำงานกับ C ได้อย่างปลอดภัยและมีประสิทธิภาพ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.