core dump saat melakukan iterasi melalui array

Saya mengalami beberapa masalah dengan kode berikut. baris baru adalah parameter yang langsung diberikan ke fungsi tempat saya bekerja. Elemen sedang dihitung sedikit lebih awal menggunakan parameter lain. Entah bagaimana, untuk beberapa kombinasi nilai untuk baris dan elemen baru saya mendapatkan core dump sementara kombinasi lainnya berfungsi dengan baik. Biasanya saat core dump terjadi sudah terjadi 20000 hingga 25000 iterasi. Namun, ketika semuanya berfungsi dengan baik, telah terjadi hingga 40.000 iterasi.

int32_t newimage[newrows][elements][3];
    int32_t pixelcounter[newrows][elements];

    //int32_t norm, angle, rohmax;
    //double r, alpha, beta, m, mu;



    //initialize arrays

    for(i=0; i<newrows; i++){
        for(j=0; j<elements; j++){
            pixelcounter[i][j] = 0;
            newimage[i][j][0] = 0;
            newimage[i][j][1] = 0;
            newimage[i][j][2] = 0;

        }
    }

kombinasi yang berfungsi dengan baik: 200 : 188

kombinasi yang mengarah ke core dump: 200 : 376

Saya menggunakan linux :-)


person user3224065    schedule 22.01.2014    source sumber


Jawaban (1)


Kemungkinan besar ini adalah masalah ruang tumpukan. Perhatikan bahwa newimage dan pixelcounter dialokasikan dalam bingkai tumpukan fungsi apa pun yang mendeklarasikannya. Anda dapat dengan cepat kehabisan ruang saat mencoba mengalokasikan data dalam jumlah besar. Gambar baru array 3d Anda tumbuh sebagai

#bytes = newrows * elemets * 3

Saya telah membersihkan program Anda (saran yang bagus adalah mencoba dan menyajikan program yang dapat dikompilasi, sehingga orang dapat membantu Anda lebih cepat!):

#include <stdio.h>
#include <stdint.h>

void test(size_t newrows, size_t elements) {
    int32_t newimage[newrows][elements][3];
    int32_t pixelcounter[newrows][elements];

    //initialize arrays

    for(size_t i=0; i<newrows; i++) {
        for(size_t j=0; j<elements; j++) {
            pixelcounter[i][j] = 0;
            newimage[i][j][0] = 0;
            newimage[i][j][1] = 0;
            newimage[i][j][2] = 0;
        }
    }
}

int main(void) {
    printf("Size of integer = %ld\n", sizeof(int));
    for (size_t i = 700; ; i += 10) {
            printf("Testing (%ld, %ld)\n", i, i);
            test(i, i);
    }
    return 0;
}

Dan menjalankan ini, saya melihat:

Size of integer = 4
Testing (700, 700)
Testing (710, 710)
Testing (720, 720)
Testing (730, 730)
[3]    13482 segmentation fault (core dumped)  ./a.out

Jadi antara 720^2 * 3 * 4 dan 730^2 * 3 * 4 byte, yaitu sekitar 6 MiB di komputer Linux 64-bit saya, mungkin berbeda di komputer Anda.

Solusi dalam hal ini adalah mengalokasikan array Anda di heap, di mana Anda akan memiliki lebih banyak memori untuk digunakan. Informasi lebih lanjut tentang array multidimensi pengalokasian heap dapat ditemukan di Bagaimana cara C mengalokasikan ruang untuk array 2D (3D...) saat menggunakan malloc?.

person Charles    schedule 02.02.2014