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

C++ 未定义的行为:数组元素的值隐式/不合逻辑地更改,c++,arrays,memory,undefined-behavior,C++,Arrays,Memory,Undefined Behavior,我想知道为什么我的代码给出了一个改变了的值y[0],而我却没有明确地改变它。我已在以下链接中提供了输出: 代码: 我提到了这个链接:,但我无法得到一个关于它是如何发生的明确答案,因为它没有提供评论中提到的任何代码 我想知道为什么在我的代码中使用静态数组而不是动态分配的数组时会发生这种情况?您在许多情况下读取的数据都超出了界限,因此调用可能会导致修改的y[0]值。您使用以下内容定义了数组边界: double df[n - 1][n - 1]; 但使用以下语句和表达式访问数组元素是不受限制的: d

我想知道为什么我的代码给出了一个改变了的值y[0],而我却没有明确地改变它。我已在以下链接中提供了输出:

代码:

我提到了这个链接:,但我无法得到一个关于它是如何发生的明确答案,因为它没有提供评论中提到的任何代码


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

您在许多情况下读取的数据都超出了界限,因此调用可能会导致修改的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,或者确保索引小于n-1和n(如果合适),以避免未定义的行为。也就是说,可变长度数组不是C++标准的一部分。

在DF分配循环的最后一次迭代中,你有i=n—1。这意味着您正在访问df[n-1][0],它是数组末尾的一个。访问该元素是未定义的行为,可能会解释您遇到的任何问题;不是标准C++,你使用什么编译器?更糟的是,当i==N 1时,最后一个循环访问DF[N],这是两个元素超出界限。并且请更清楚地知道输入、输出和预期输出是什么。您在这里更改y[0]的值std::cin>>y[i]@tobi303,我正在使用gnu编译器c++11如果可变长度数组不是其中的一部分,那么标准gcc编译器是否应该首先停止编译此类代码?@KewalShah一些编译器支持它,当使用适当的标志时会发出警告。@KewalShah大多数编译器支持各种扩展。有些扩展是隐式的—您需要一个标志或选项来禁用它,而另一些是显式的—您需要一个标志或选项来启用它。gcc的VLA支持是一个隐式的主动扩展,如果你问我的话,它弊大于利。@FrançoisAndrieux所以我应该在每次编译时使用-Wall-Werror,对吗?@KewalShah你肯定应该使用第一个。也许-韦斯特拉和-学究。
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