所以我已经跟踪了段落错误,但我不明白为什么这是一个段错误。有人可以详细说明我的方式错误吗?
以下是变量声明。
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数组。
答案 0 :(得分:1)
while (i == 0 || d != 0) {
d = a1[i][m]; <------SEGFAULT per GDB
++m;
}
在某些情况下(例如在外循环的第一次迭代中),这是一个无限的while
循环。
答案 1 :(得分:1)
您的外部循环以i = 0
开头,内部循环以d = 0
开头,控制while
循环的逻辑不足(请参阅代码注释)。
for (i = 0; i < 256; ++i) {
for (j = n = m = d = 0; j < 256; j = m) {
// Here i == 0 is ALWAYS true (so d != 0 is ignored due to
// short-circuit evaluation) and then 'm' is continuously incremented
// until it goes out of bounds
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;
}
}
答案 2 :(得分:1)
问题在于以下几行:
while (i == 0 || d != 0) {
d = a1[i][m]; <------SEGFAULT per GDB
++m;
}
当i
等于0时,你的while循环将继续运行。由于你永远不会在while循环中递增i
,m
会一直持续递增,直到超出界限,导致您遇到的段错问题。
请务必检查i
和m
的值,以便它们位于已分配的内存范围内,并且您的代码可以正常运行。