为什么这个Segfault Occuring?

时间:2015-04-21 22:46:59

标签: c++ arrays segmentation-fault interpolation

所以我已经跟踪了段落错误,但我不明白为什么这是一个段错误。有人可以详细说明我的方式错误吗?

以下是变量声明。

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

3 个答案:

答案 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循环中递增im会一直持续递增,直到超出界限,导致您遇到的段错问题。

请务必检查im的值,以便它们位于已分配的内存范围内,并且您的代码可以正常运行。