การแบ่งส่วนผิดพลาดด้วย fscanf ในไฟล์ขนาดใหญ่

ฉันกำลังพยายามจัดเก็บตัวเลขสองตัวแรกในไฟล์เป็นตัวแปร จากนั้นตัวเลขที่เหลือในไฟล์ในอาร์เรย์

รหัสต่อไปนี้ทำงานได้ดีกับอินพุตขนาดเล็ก แต่ฉันสงสัยว่าเหตุใดจึงมีข้อผิดพลาดในไฟล์อินพุตขนาดใหญ่ ฉันสามารถพิมพ์ค่าทั้งหมดใน for loop ก่อนที่จะได้รับ Segmentation Fault: 11 ส่งคืน

FILE * fp;

fp = fopen("test.text", "r");

int i;
fscanf(fp, "%d", &i);
int param1 = i;
fscanf(fp, "%d", &i);
int param2 = i;

int list[param2];
int j;

for (j = 0; j < param2; j++) {
  fscanf(fp, "%d", &list[j]);
}
fclose(fp);

person GregW    schedule 09.02.2020    source แหล่งที่มา
comment
อาจเป็นเพราะ param2 ใหญ่เกินไป ดังนั้นจึงไม่สามารถจัดสรร int list[param2]; ได้   -  person ForceBru    schedule 09.02.2020
comment
@ForceBru d สูงสุด 2^14   -  person GregW    schedule 09.02.2020


คำตอบ (1)


ตามที่ @ForceBru แสดงความคิดเห็นสั้น ๆ แล้ว มันเป็นปัญหาของ int list[param2];

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

หากคอมไพล์ด้วย j ที่จัดสรรหลังบัฟเฟอร์ ซึ่งอาจเกิดขึ้นในกรณีนี้ คอมพิวเตอร์จะเข้าถึงตำแหน่ง stack_pointer + param2 * sizeof(int) + sizeof(int) เพื่อจัดเก็บ 0 (j = 0)

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

สำหรับบัฟเฟอร์ขนาดใหญ่ โปรดดูที่ malloc

person Work of Artiz    schedule 09.02.2020