我想知道为什么当我无法明确地更改它时,我的代码会给出y [0]的更改值。我在下面的链接中提供了输出:
代码:
#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,但我无法得到明确的答案,因为它没有提供任何代码(如评论中所述)。
我想知道为什么这会在我的代码中发生静态数组而不是动态分配的?
答案 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 ++标准的一部分。