【发布时间】:2015-04-21 22:46:59
【问题描述】:
所以我已经将段错误追溯到该行,但我不明白为什么这是段错误。有人可以详细说明我的方式的错误吗?
这里是变量声明。
size_t i, j, n, m, chunk_size, pixel_size;
i = j = n = m = 0;
chunk_size = 256;
pixel_size = 4;
这里是数组声明。
uint8_t** values = new uint8_t*[chunk_size];
for (i = 0; i < chunk_size; ++ i)
values[i] = new uint8_t[chunk_size];
float** a1 = new float*[chunk_size];
for (i = 0; i < chunk_size; ++i)
a1[i] = new float[chunk_size];
这就是发生段错误的地方。
float delta, d;
for (i = 0; i < 256; ++i) {
for (j = n = m = d = 0; j < 256; j = m) {
while (i == 0 || d != 0) {
d = a1[i][m]; <------SEGFAULT per GDB
++m;
}
delta = (d - a1[i][j]) / m;
n = j + 1;
while (n < j + m) {
a1[i][n] = a1[i][n - 1] + delta;
++n;
}
}
}
我对 C++ 还很陌生,无法弄清楚为什么这是一个段错误。这不是将变量值设置为数组中变量的正确方法吗?这是我的段错误的根源吗?
注意:整个事情的重点是使用我的简单插值公式将 4x4 数组扩展为 256x256 数组。
【问题讨论】:
-
只要 m 大于或等于 chunk_size ,您就超出了数组的边界。这将是我对它的猜测。我还建议使用有意义的变量名,i、j、n、m 和 d 的描述性不是很强,而且更难弄清楚你要做什么。
-
绝对确定
i和m在调用d = a1[i][m];时在界内? -
您的 while 循环对
m超出范围没有安全性。 -
对于
i和m的哪些值,您得到了段错误? -
哇,谢谢大家的快速回复!我完全忽略了
i和它的界限。这仅适用于初始条件,所以一段时间后,m < 256的附加值似乎是补救措施。
标签: c++ arrays segmentation-fault interpolation