gpt4 book ai didi

c++ - 未定义行为 : value of array element changes implicitly/illogically

转载 作者:行者123 更新时间:2023-11-28 04:57:33 24 4
gpt4 key购买 nike

我想知道为什么我的代码给出了 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 ,但由于它没有提供任何代码(如评论中所述),所以我无法明确回答它是如何发生的。

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

最佳答案

您多次越界读取,因此调用 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,要么确保索引小于 n-1n 在适当的地方避免未定义的行为。也就是说,可变长度数组不是 C++ 标准的一部分。

关于c++ - 未定义行为 : value of array element changes implicitly/illogically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46833636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com