私は明示的に変更していないときにコードが変更された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;
}
Iが動的に使用してメモリを割り当てる場合にも、それは[0] Yの不変の値を与える:
Iは、以下のリンクに出力を提供していますdouble* x = new double[n];
double* y = new double[n];
私はこのリンクを参照しました:Value of array member changes illogically、しかし、私はどのようにそれは(コメントに記載されているように)コードを提供しないので起こります。
なぜ私のコードでは静的な配列で、動的に割り付けられていないのですか?
あなたの 'df'代入ループの最後の反復で、' i == n - 1'があります。つまり、配列の最後を過ぎた 'df [n-1] [0]'にアクセスしています。その要素にアクセスすることは未定義の動作であり、発生している問題を説明する可能性があります。 –
'double x [n];'は標準のC++ではありませんが、どのコンパイラを使用していますか? – user463035818
さらに悪いことに、 'i == n - 1'のとき、最後のループは' df [n] 'にアクセスします。これは境界外の2つの要素です。 – chris