迭代数组时的核心转储

时间:2014-01-22 15:26:55

标签: core dump coredump

我遇到以下代码的问题。 newrows是一个直接赋予我正在使用的函数的参数。使用另一个参数稍早计算元素。不知何故,对于newrows和元素的某些值组合,我得到了一个核心转储,而其他组合工作正常。通常,当核心转储发生时,已经进行了20000到25000次迭代。但是,当一切正常时,最多有40000次迭代。

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;

        }
    }

组合工作正常:200:188

导致核心转储的组合:200:376

我正在使用linux btw: - )

1 个答案:

答案 0 :(得分:0)

这很可能是堆栈空间问题。请注意,newimagepixelcounter正在堆栈帧中分配,无论这些函数是在哪个函数中声明的。您可以快速耗尽空间来尝试分配大量数据。你的3d数组newimage增长为

#bytes = newrows * elemets * 3

我清理了你的程序(一个很好的建议是尝试提供编译的程序,所以人们可以更快地帮助你!):

#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;
}

运行这个,我明白了:

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

所以介于720^2 * 3 * 4730^2 * 3 * 4字节之间,在我的64位Linux计算机上大约为6 MiB,在您的计算机上可能会有所不同。

在这种情况下,解决方案是在堆上分配您的数组,在那里您将有更多的内存可供使用。有关堆分配多维数组的更多信息,请参见How does C allocate space for a 2D (3D...) array when using malloc?