Kesalahan segmentasi dengan fscanf pada file besar

Saya mencoba menyimpan dua angka pertama dalam file sebagai variabel, kemudian angka yang tersisa dalam file dalam array.

Kode berikut berfungsi dengan baik pada input yang lebih kecil, tetapi saya bertanya-tanya - mengapa ada kesalahan pada file input yang lebih besar? Saya dapat mencetak semua nilai dalam loop for, sebelum mengembalikan 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 sumber
comment
Mungkin karena param2 terlalu besar sehingga int list[param2]; tidak bisa dialokasikan   -  person ForceBru    schedule 09.02.2020
comment
@ForceBru d paling banyak 2^14.   -  person GregW    schedule 09.02.2020


Jawaban (1)


Seperti yang sudah dikomentari secara singkat oleh @ForceBru, ini adalah masalah dengan int list[param2];

Ketika sebuah daftar dideklarasikan seperti ini, buffer disimpan di tumpukan, alokasi terjadi hanya dengan kompiler yang meningkatkan penunjuk tumpukan dengan jumlah param2.

Jika ini dikompilasi dengan j yang dialokasikan setelah buffer, yang mungkin terjadi di sini, komputer akan mengakses lokasi stack_pointer + param2 * sizeof(int) + sizeof(int) untuk menyimpan 0 (j = 0).

Tumpukannya terbatas, itulah nama situs ini, ketika buffer yang berada jauh di luar tumpukan diakses, kernel hanya akan melihat Anda menulis di suatu tempat yang sangat jauh dari memori yang sah dan akan menganggap ada yang tidak beres.

Untuk buffer besar, lihat malloc.

person Work of Artiz    schedule 09.02.2020