ความผิดพลาดในการแบ่งส่วนคืออะไร?


598

ความผิดพลาดในการแบ่งส่วนคืออะไร? มันแตกต่างใน C และ C ++ หรือไม่ ข้อผิดพลาดในการแบ่งกลุ่มและตัวชี้ห้อยเกี่ยวข้องอย่างไร


93
ความผิดส่วนทำให้ไม่ดีคอมไพเลอร์รู้สึก
Benjamin Crouzier

22
หากเป็นเช่นนั้นเหตุใดในกรณีของฉันคอมไพเลอร์ก็ไม่ได้บ่นอะไรเลยมันก็ราบรื่น แต่ในเวลาทำงานระบบจะทำการแบ่งเซกเมนต์ (การถ่ายโอนข้อมูลหลัก) T_T
Jim Raynor

3
แค่ถ่ายโอนข้อมูลหน่วยความจำเมื่อมีบางอย่างผิดปกติ!
resultsway

7
@pinouchon: ตลก แต่เมื่อรวบรวมมีสิ่งที่จะทำอย่างไรกับความผิดพลาดของ Seg หรือไม่? มันไม่ได้เป็นสิ่งแวดล้อมเวลารัน?
dhein

1
โดยทั่วไปเรียกว่าโดยพยายามที่จะ dereference ชี้โมฆะดังนั้นความผิดพลาดในการแบ่งส่วนมักจะเป็นคล้ายกับ NullPointerExceptionJava
Raedwald

คำตอบ:


673

การแบ่งส่วนความผิดพลาดเป็นข้อผิดพลาดชนิดหนึ่งที่เกิดจากการเข้าถึงหน่วยความจำที่“ ไม่ได้เป็นของคุณ” มันเป็นกลไกตัวช่วยที่ทำให้คุณไม่สามารถทำลายหน่วยความจำและแนะนำบั๊กหน่วยความจำที่ยากต่อการดีบัก เมื่อใดก็ตามที่คุณได้รับ segfault คุณจะรู้ว่าคุณกำลังทำสิ่งผิดปกติกับหน่วยความจำ - การเข้าถึงตัวแปรที่ได้รับการปลดปล่อยแล้วการเขียนไปยังส่วนของหน่วยความจำแบบอ่านอย่างเดียวและอื่น ๆ การจัดการหน่วยความจำไม่มีความแตกต่างหลักระหว่าง segfaults ใน C และ C ++

มีหลายวิธีในการรับ segfault อย่างน้อยในภาษาระดับต่ำกว่าเช่น C (++) วิธีทั่วไปในการรับ segfault คือการยกเลิกการอ้างถึงตัวชี้ null:

int *p = NULL;
*p = 1;

segfault อื่นเกิดขึ้นเมื่อคุณพยายามเขียนลงในส่วนของหน่วยความจำที่ทำเครื่องหมายว่าอ่านอย่างเดียว:

char *str = "Foo"; // Compiler marks the constant string as read-only
*str = 'b'; // Which means this is illegal and results in a segfault

ตัวชี้กำลังชี้ไปยังสิ่งที่ไม่มีอยู่อีกต่อไปเช่นที่นี่:

char *p = NULL;
{
    char c;
    p = &c;
}
// Now p is dangling

ตัวชี้pdangles เนื่องจากชี้ไปที่ตัวแปรอักขระcที่หยุดอยู่หลังจากบล็อกสิ้นสุดลง และเมื่อคุณพยายามที่จะอ่านเอกสาร dangling pointer (เช่น*p='A') คุณอาจได้รับ segfault


154
ตัวอย่างสุดท้ายนั้นน่ารังเกียจเป็นพิเศษเมื่อฉันสร้าง: int main () {char * p = 0; {char c = 'x'; p = & c; } printf ("% c \ n", * p); กลับ 0 } ด้วย gcc หรือคอมไพเลอร์อื่น ๆ ก็จะปรากฏขึ้นเพื่อทำงาน ไม่มีคำเตือนในการรวบรวม ไม่มี segfault นี่เป็นเพราะขอบเขต '}' ไม่ได้ลบข้อมูลจริง ๆ เพียงทำเครื่องหมายว่าเป็นอิสระที่จะใช้อีกครั้ง รหัสสามารถทำงานได้ดีบนระบบการผลิตเป็นเวลาหลายปีคุณเปลี่ยนส่วนอื่นของรหัสเปลี่ยนคอมไพเลอร์หรืออย่างอื่นและ BOOOOOM!
Chris Huang-Leaver

36
ขออภัยในความผิดพลาด แต่เป็นเพียงข้อความด้านข้าง ... ไม่มีตัวอย่างของคุณที่ทำให้เกิด segfault จริงๆแล้วมันเป็นพฤติกรรมที่ไม่ได้กำหนด ;-)
oldrinb

18
@oldrinb: มันเป็นไปไม่ได้ที่จะเขียนโค้ดที่จำเป็นต้องมี segfault ไม่น้อยเพราะมีระบบที่ทำงานโดยไม่มีการป้องกันหน่วยความจำดังนั้นจึงไม่สามารถบอกได้ว่าชิ้นส่วนของหน่วยความจำจริง ๆ "เป็นของคุณ" และไม่รู้จัก segfaults พฤติกรรมที่ไม่ได้กำหนดเท่านั้น ... (ตัวอย่าง AmigaOS คลาสสิก)
DevSolar

7
@ ChrisHuang-Leaver คุณต้องเข้าใจว่าcมันเป็นแบบโลคอลหมายความว่ามันถูกผลักลงบนสแต็กหลังจากนั้น{และป๊อปอัปออกมาหลังจาก}นั้น dangling pointer เป็นเพียงการอ้างอิงถึง offset ซึ่งตอนนี้ออกมาจาก stack นั่นเป็นสาเหตุที่การแก้ไขในโปรแกรมอย่างง่ายจะไม่ทำให้เกิด segfault ใด ๆ ในทางกลับกันอาจนำไปสู่ ​​segfault ในกรณีการใช้งานที่ซับซ้อนมากขึ้นซึ่งการเรียกฟังก์ชั่นอื่น ๆ อาจนำไปสู่สแต็คที่จะเติบโตและมีข้อมูลที่ชี้ไปโดยชี้ห้อย การเขียนไปยังข้อมูลนั้น (vars ในพื้นที่) จะนำไปสู่พฤติกรรมที่ไม่ได้กำหนด (segfault & Co)
Ayman Khamouma

3
@ ChrisHuang-Leaver ตามปกติเมื่อคุณไม่อยู่ในขอบเขตคอมไพเลอร์จะต้องกู้คืนพื้นที่สแต็กบางส่วนเพื่อเพิ่มพื้นที่สแต็กที่ไม่ได้ใช้ แต่สิ่งนี้ไม่ได้เกิดขึ้นเสมอไป (โดย gcc เป็นหนึ่งในคอมไพเลอร์นี้) นอกจากนี้พื้นที่สแต็กที่ถูกจัดสรรจะถูกนำมาใช้ซ้ำอีกครั้งดังนั้นฉันจึงไม่เคยได้ยินระบบปฏิบัติการที่ส่งคืนสแต็กเพจที่ไม่ได้ใช้ไปยังระบบทำให้พื้นที่นั้นอยู่ภายใต้การ a SIGSEGVดังนั้นฉันจึงไม่คาดหวังว่า
Luis Colorado

111

มันจะคุ้มค่าที่จะสังเกตว่าข้อผิดพลาดในการแบ่งส่วนนั้นไม่ได้เกิดจากการเข้าถึงหน่วยความจำกระบวนการอื่นโดยตรง (นี่คือสิ่งที่ฉันได้ยินในบางครั้ง) เนื่องจากเป็นไปไม่ได้ ด้วยหน่วยความจำเสมือนทุกขั้นตอนจะมีพื้นที่ที่อยู่เสมือนของตัวเองและไม่มีทางที่จะเข้าถึงอีกอันโดยใช้ค่าของตัวชี้ใด ๆ ข้อยกเว้นนี้สามารถใช้ร่วมกันกับไลบรารีซึ่งเป็นพื้นที่ที่อยู่ทางกายภาพเดียวกันที่แมปไป (อาจ) ที่อยู่เสมือนที่แตกต่างกันและหน่วยความจำเคอร์เนลซึ่งแมปในลักษณะเดียวกันในทุกกระบวนการ (เพื่อหลีกเลี่ยงการล้าง TLB บน syscall) และสิ่งต่าง ๆ เช่น shmat;) - นี่คือสิ่งที่ฉันนับว่าเป็นการเข้าถึงแบบทางอ้อม อย่างไรก็ตามหนึ่งสามารถตรวจสอบว่าพวกเขามักจะอยู่ไกลจากรหัสกระบวนการและเรามักจะสามารถเข้าถึงพวกเขา (นี่คือเหตุผลที่พวกเขามี

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

และทั้งหมดนี้เกี่ยวกับระบบหน่วยความจำเสมือน


ด้วยไฟล์ที่แมปหน่วยความจำ / หน่วยความจำที่แชร์เป็นไปได้ที่บุคคลอื่นจะยุ่งกับหน่วยความจำของคุณ ใน WIN32 มี API ที่น่ารังเกียจเช่น 'WriteProcessMemory' ด้วย!
paulm

1
@paulm: ใช่ฉันรู้ นี่คือสิ่งที่ฉันมีอยู่ในใจใน "และสิ่งต่าง ๆ เช่น shmat;) - นี่คือสิ่งที่ฉันนับเป็นการเข้าถึง 'ทางอ้อม'
konrad.kruczynski

ในระบบปฏิบัติการหน่วยความจำเสมือนไม่มีทาง (ปกติแล้วดังนั้นผู้พัฒนาระบบปฏิบัติการอย่าทำแบบนี้) สำหรับกระบวนการในการเข้าถึงหน่วยความจำเสมือนกระบวนการอื่นไม่ใช้หน่วยความจำชนิดใดชนิดหนึ่งที่แนบสายระบบที่ช่วยให้คุณ เข้าไป. ที่อยู่หน่วยความจำเสมือนโดยทั่วไปหมายถึงสิ่งต่าง ๆ ขึ้นอยู่กับกระบวนการที่พิจารณา
Luis Colorado

38

ความผิดพลาดของการแบ่งส่วนเกิดจากการร้องขอสำหรับเพจที่กระบวนการไม่ได้ระบุไว้ในตารางตัวให้คำอธิบายหรือการร้องขอที่ไม่ถูกต้องสำหรับหน้านั้นมีอยู่ในรายการ (เช่นการร้องขอการเขียนบนหน้าอ่านอย่างเดียว)

ตัวชี้ห้อยเป็นตัวชี้ที่อาจหรืออาจไม่ชี้ไปยังหน้าที่ถูกต้อง แต่จะชี้ไปยังส่วนของหน่วยความจำ "ที่ไม่คาดคิด"


10
สิ่งนี้เป็นเรื่องจริง แต่จะช่วยคุณได้จริงหรือไม่หากคุณไม่ทราบว่าการแบ่งส่วนแบบผิดปกติคืออะไร
zoul

29

พูดตามความจริงตามที่ผู้โพสต์คนอื่นพูดถึง Wikipedia มีบทความที่ดีมากเกี่ยวกับเรื่องนี้ดังนั้นลองมาดูที่นั่น ข้อผิดพลาดประเภทนี้เกิดขึ้นบ่อยมากและมักเรียกสิ่งอื่น ๆ เช่นการละเมิดการเข้าถึงหรือข้อบกพร่องการป้องกันทั่วไป

พวกเขาจะไม่แตกต่างกันใน C, C ++ หรือภาษาอื่น ๆ ที่ช่วยให้พอยน์เตอร์ ข้อผิดพลาดประเภทนี้มักเกิดจากพอยน์เตอร์ที่

  1. ใช้ก่อนที่จะเริ่มต้นอย่างถูกต้อง
  2. ใช้หลังจากหน่วยความจำที่พวกเขาชี้ไปที่ได้รับการจัดสรรหรือลบ
  3. ใช้ในอาเรย์ที่ทำดัชนีโดยที่ดัชนีนั้นอยู่นอกขอบเขตของอาเรย์ โดยทั่วไปนี่เป็นเฉพาะเมื่อคุณกำลังทำการคำนวณทางคณิตศาสตร์ในอาร์เรย์แบบดั้งเดิมหรือ c-strings ไม่ใช่คอลเล็กชันที่ใช้ STL / Boost (ใน C ++)

16

ตามวิกิพีเดีย:

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


13

การแบ่งส่วนความผิดเกิดจากความล้มเหลวของฮาร์ดแวร์ในกรณีนี้หน่วยความจำแรม นี่เป็นสาเหตุที่พบได้ทั่วไปน้อยลง แต่ถ้าคุณไม่พบข้อผิดพลาดในรหัสของคุณบางที memtest อาจช่วยคุณได้

ทางออกในกรณีนี้เปลี่ยนแรม

แก้ไข:

ที่นี่มีการอ้างอิง: ความผิดการแบ่งส่วนโดยฮาร์ดแวร์


3
การทดสอบที่รวดเร็วและสกปรกสำหรับ RAM ที่ผิดพลาดคือการรันโปรแกรมที่ล้มเหลวซ้ำแล้วซ้ำอีกในการวนซ้ำ หากโปรแกรมไม่มี nondeterminism ภายใน - นั่นคือมันจะสร้างผลลัพธ์เดียวกันสำหรับอินพุตเดียวกันหรืออย่างน้อยก็ควรจะทำ - แต่สำหรับอินพุตบางอย่างมันจะล้มเหลวในบางครั้งไม่เสมอไป แต่ไม่เคย: คุณควร เริ่มกังวลเรื่อง RAM ไม่ดี
zwol

8

ความผิดพลาดของการแบ่งส่วนเกิดขึ้นเมื่อกระบวนการ (การรันอินสแตนซ์ของโปรแกรม) กำลังพยายามเข้าถึงที่อยู่หน่วยความจำแบบอ่านอย่างเดียวหรือช่วงหน่วยความจำซึ่งกำลังถูกใช้โดยกระบวนการอื่นหรือเข้าถึงที่อยู่หน่วยความจำที่ไม่มีอยู่ ปัญหา Dangling Reference (ตัวชี้)หมายถึงการพยายามเข้าถึงวัตถุหรือตัวแปรที่เนื้อหาถูกลบออกจากหน่วยความจำแล้วเช่น:

int *arr = new int[20];
delete arr;
cout<<arr[1];  //dangling problem occurs here

4
วิธีที่ถูกต้องในการลบอาร์เรย์คือ delete [] arr;
Damian

8

หน้าSegmentation_faultของ Wikipedia มีคำอธิบายที่ดีมากเกี่ยวกับเรื่องนี้เพียงแค่ระบุสาเหตุและเหตุผล ดูวิกิพีเดียเพื่อดูคำอธิบายโดยละเอียด

ในการคำนวณความผิดพลาดของการแบ่งส่วน (มักสั้นลงถึง segfault) หรือการละเมิดการเข้าถึงเป็นความผิดที่เกิดจากฮาร์ดแวร์ที่มีการป้องกันหน่วยความจำโดยแจ้งให้ระบบปฏิบัติการ (OS) ทราบเกี่ยวกับการละเมิดการเข้าถึงหน่วยความจำ

ต่อไปนี้เป็นสาเหตุทั่วไปของความผิดพลาดในการแบ่งกลุ่ม:

  • การยกเลิกการชี้ NULL พอยน์เตอร์ - นี่เป็นกรณีพิเศษโดยฮาร์ดแวร์การจัดการหน่วยความจำ
  • ความพยายามในการเข้าถึงที่อยู่หน่วยความจำที่ไม่มีอยู่ (พื้นที่ที่อยู่ของกระบวนการภายนอก)
  • ความพยายามในการเข้าถึงหน่วยความจำโปรแกรมไม่มีสิทธิ์ (เช่นโครงสร้างเคอร์เนลในบริบทของกระบวนการ)
  • ความพยายามในการเขียนหน่วยความจำแบบอ่านอย่างเดียว (เช่นเซ็กเมนต์รหัส)

สิ่งเหล่านี้มักเกิดจากข้อผิดพลาดในการเขียนโปรแกรมซึ่งส่งผลให้เกิดการเข้าถึงหน่วยความจำที่ไม่ถูกต้อง:

  • การอ้างอิงหรือการกำหนดให้กับตัวชี้ที่ไม่มีการกำหนดค่าเริ่มต้น (ตัวชี้ป่าซึ่งชี้ไปยังที่อยู่หน่วยความจำแบบสุ่ม)

  • การอ้างถึงหรือกำหนดให้กับตัวชี้ที่เป็นอิสระ (ตัวชี้ห้อยซึ่งชี้ไปยังหน่วยความจำที่ได้รับการเพิ่ม / ยกเลิกการจัดสรร / ลบ)

  • บัฟเฟอร์ล้น

  • สแต็กล้น

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


6

กล่าวอย่างง่าย ๆ : การแบ่งเซกเมนต์เป็นระบบปฏิบัติการที่ส่งสัญญาณไปยังโปรแกรมโดยบอกว่าตรวจพบการเข้าถึงหน่วยความจำที่ผิดกฎหมายและกำลังยกเลิกโปรแกรมก่อนกำหนดเพื่อป้องกันไม่ให้หน่วยความจำเสียหาย


3

"การแบ่งกลุ่มผิดพลาด" หมายความว่าคุณพยายามเข้าถึงหน่วยความจำที่คุณไม่สามารถเข้าถึงได้

ปัญหาแรกอยู่ที่ข้อโต้แย้งหลักของคุณ หน้าที่หลักควรเป็นint main(int argc, char *argv[])และคุณควรตรวจสอบว่า argc มีอย่างน้อย 2 ก่อนที่จะเข้าถึง argv [1]

นอกจากนี้เนื่องจากคุณผ่านการลอยเป็น printf (ซึ่งโดยวิธีการได้รับการแปลงเป็นสองเท่าเมื่อผ่านไปยัง printf) คุณควรใช้ตัวระบุรูปแบบ% f ตัวระบุรูปแบบ% s ใช้สำหรับสตริง (อาร์เรย์อักขระ '\ 0'-terminated)


2

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

 /* "Array out of bounds" error 
   valid indices for array foo
   are 0, 1, ... 999 */
   int foo[1000];
   for (int i = 0; i <= 1000 ; i++) 
   foo[i] = i;

ที่นี่ฉันไม่มี [1,000] อยู่ดังนั้นจึงเกิด segfault

สาเหตุของการแบ่งส่วนความผิดพลาด:

it arise primarily due to errors in use of pointers for virtual memory addressing, particularly illegal access.

De-referencing NULL pointers  this is special-cased by memory management hardware.

Attempting to access a nonexistent memory address (outside processs address space).

Attempting to access memory the program does not have rights to (such as kernel structures in process context).

Attempting to write read-only memory (such as code segment).

2
ก่อนอื่นข้อผิดพลาดของ seg ไม่มีส่วนเกี่ยวข้องกับที่อยู่หรือไม่มีอยู่ มันเกี่ยวกับคุณกำลังเข้าถึงที่คุณไม่ได้รับอนุญาตให้ทำ และในตัวอย่างพิเศษของคุณมันยังรับประกันตามมาตรฐานว่ามีที่ตั้งอยู่ ตั้งแต่มาตรฐานกล่าวว่าในกรณีอาร์เรย์จะต้องมีการระบุว่ามีความเป็นอยู่ที่ถูกต้องสำหรับ pointg ชี้บนอาร์เรย์สอดคล้องกันภายในขอบเขตของมันและ 1 ที่อยู่เบื้องหลัง
dhein

มันซ้ำกับที่อยู่ถ้าคุณไม่มีที่อยู่และหากคุณพยายามเข้าถึงที่อยู่นี้ก็มี seg ความผิด และในตัวอย่างของฉันมันเป็นเพียงความเข้าใจในมุมมอง
Mohit Rohilla

2

มีคำอธิบายที่ดีหลายประการของ "ความผิดส่วน" ในคำตอบตั้งแต่ที่มีความผิดส่วนมักจะมีการถ่ายโอนข้อมูลของเนื้อหาหน่วยความจำที่มี แต่ผมอยากจะแบ่งปันที่ความสัมพันธ์ระหว่าง "แก่นทิ้ง" มีส่วนร่วมในความผิดส่วน (หลักทิ้ง)และ หน่วยความจำมาจาก:

จากปีพ. ศ. 2498 ถึง 2518 - ก่อนหน้าหน่วยความจำเซมิคอนดักเตอร์ - เทคโนโลยีที่โดดเด่นในหน่วยความจำคอมพิวเตอร์ใช้แม่เหล็กโดนัทขนาดเล็กที่พันกันบนสายทองแดง โดนัทเป็นที่รู้จักกันในชื่อ "แกนเฟอร์ไรต์" และหน่วยความจำหลักที่รู้จักกันในชื่อ "หน่วยความจำหลัก" หรือ "แกนกลาง"

ที่นำมาจากที่นี่


2

มีคำจำกัดความของการแบ่งเซ็กเมนต์ที่เพียงพอฉันต้องการอ้างอิงตัวอย่างเล็ก ๆ น้อย ๆ ที่ฉันเจอในขณะที่การเขียนโปรแกรมซึ่งอาจดูเหมือนความผิดพลาดโง่ ๆ แต่จะเสียเวลามาก

  1. คุณสามารถรับข้อผิดพลาดการแบ่งกลุ่มในกรณีด้านล่างในขณะที่ประเภท argumet ไม่ตรงกันใน printf

    #include<stdio.h> int main(){
    int a = 5; printf("%s",a); return 0; }

ผลลัพธ์: Segmentation Fault (SIGSEGV)

  1. เมื่อคุณลืมจัดสรรหน่วยความจำให้กับตัวชี้ แต่พยายามใช้งาน

     #include<stdio.h> 
     typedef struct{
       int a;
     }myStruct;   
    int main(){
      myStruct *s;
      /* few lines of code */
      s->a = 5;
      return 0;
    }

ผลลัพธ์: Segmentation Fault (SIGSEGV)


1

ความหมายง่ายๆSegmentation faultคือคุณพยายามเข้าถึงหน่วยความจำบางส่วนที่ไม่ได้เป็นของคุณ Segmentation faultเกิดขึ้นเมื่อเราพยายามอ่านและ / หรือเขียนงานในตำแหน่งหน่วยความจำแบบอ่านอย่างเดียวหรือพยายามที่จะเพิ่มหน่วยความจำ กล่าวอีกนัยหนึ่งเราสามารถอธิบายสิ่งนี้ว่าเป็นความเสียหายของหน่วยความจำ

Segmentation faultด้านล่างนี้ผมพูดถึงความผิดพลาดที่พบบ่อยทำโดยโปรแกรมเมอร์ที่นำไปสู่

  • ใช้scanf()ในทางที่ผิด (ลืมใส่&)
int num;
scanf("%d", num);// must use &num instead of num
  • ใช้ตัวชี้ในทางที่ผิด
int *num; 
printf("%d",*num); //*num should be correct as num only
//Unless You can use *num but you have to point this pointer to valid memory address before accessing it.
  • การปรับเปลี่ยนสตริงตัวอักษร (ตัวชี้พยายามเขียนหรือแก้ไขหน่วยความจำแบบอ่านอย่างเดียว)
char *str;  

//Stored in read only part of data segment
str = "GfG";      

//Problem:  trying to modify read only memory
*(str+1) = 'n';
  • พยายามติดต่อผ่านที่อยู่ซึ่งเป็นอิสระแล้ว
// allocating memory to num 
int* num = malloc(8); 
*num = 100; 

// de-allocated the space allocated to num 
free(num); 

// num is already freed there for it cause segmentation fault
*num = 110; 
  • Stack Overflow -: หน่วยความจำไม่เพียงพอในกองซ้อน
  • การเข้าถึงอาร์เรย์นอกขอบเขต '
  • ใช้ตัวระบุรูปแบบที่ไม่ถูกต้องเมื่อใช้printf()และscanf()'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.