为什么会发生这种隔离错误

Why is this Segfault Occuring?

本文关键字:隔离 错误 为什么      更新时间:2023-10-16

所以我已经将段错误追溯到行,但我不明白为什么这是一个段错误。有人可以详细说明我的方式错误吗?

下面是变量声明。

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 数组。

while (i == 0 || d != 0) {
    d = a1[i][m];    <------SEGFAULT per GDB
    ++m;
}

在某些情况下,这是一个无休止的while循环(例如,在外循环的第一次迭代中)。

外部循环以 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;
    }
}

问题出在以下几行:

while (i == 0 || d != 0) {
        d = a1[i][m];    <------SEGFAULT per GDB
        ++m;
}

您的 while 循环将继续进行,而 i 等于 0。由于您从不递增 while 循环中的i,因此m会永远递增,直到超出界限,从而导致您遇到的段错误问题。

确保检查 im 的值,以便它们在分配的内存范围内,并且您的代码将正常工作。