未定义的行为:数组元素的值隐式/不合逻辑地更改

时间:2017-10-19 15:33:27

标签: c++ arrays memory undefined-behavior

我想知道为什么当我无法明确地更改它时,我的代码会给出y [0]的更改值。我在下面的链接中提供了输出:

Code Output

代码:

#include <iostream>

int main() {
    std::cout << "Enter total number of values of x/y" << std::endl;
    int n;
    std::cin >> n;

    double x[n];
    double y[n];
    double df[n - 1][n - 1];

    std::cout << "Enter values of x:" << std::endl;

    for (int i = 0; i < n; i++) {
        std::cin >> x[i];
    }

    std::cout << "Enter values of y:" << std::endl;

    for (int i = 0; i < n; i++) {
        std::cin >> y[i];
    }

    std::cout << std::endl;

    for (int i = 0; i < n; i++) {
        df[i][0] = y[i + 1] - y[i];
    }

    std::cout << "value of y[0] before: " << y[0] << std::endl;

    for (int j = 1; j < n - 1; j++) {
        for (int i = 0; i < n; i++) {
            df[i][j] = df[i + 1][j - 1] - df[i][j - 1];
        }
    }

    std::cout << "value of y[0] after: " << y[0] << std::endl;
}

此外,如果我使用:

动态分配内存,它会给出y [0]的未更改值
double* x = new double[n];
double* y = new double[n];

我提到了这个链接:Value of array member changes illogically,但我无法得到明确的答案,因为它没有提供任何代码(如评论中所述)。

我想知道为什么这会在我的代码中发生静态数组而不是动态分配的?

1 个答案:

答案 0 :(得分:1)

您正在多次读取界限,从而调用undefined behavior,这可能会导致修改后的y[0]值。您使用以下命令定义了数组边界:

double df[n - 1][n - 1];

但是使用以下语句和表达式,您将访问超出范围的数组元素:

df[i][0] = y[i + 1] - y[i]; // everything except the y[i]
df[i + 1][j - 1]
df[i][j]
df[i][j - 1];
df[i + 1][j - 1]
df[i][0] = y[i + 1] - y[i]
df[i][j] = df[i + 1][j - 1] - df[i][j - 1]; // everything

将数组边界修改为大于n-1或确保索引 <{1}}和n-1,以避免未定义的行为。话虽这么说,可变长度数组不是C ++标准的一部分。