我遇到以下代码的问题。 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: - )
答案 0 :(得分:0)
这很可能是堆栈空间问题。请注意,newimage
和pixelcounter
正在堆栈帧中分配,无论这些函数是在哪个函数中声明的。您可以快速耗尽空间来尝试分配大量数据。你的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 * 4
和730^2 * 3 * 4
字节之间,在我的64位Linux计算机上大约为6 MiB,在您的计算机上可能会有所不同。
在这种情况下,解决方案是在堆上分配您的数组,在那里您将有更多的内存可供使用。有关堆分配多维数组的更多信息,请参见How does C allocate space for a 2D (3D...) array when using malloc?。