我很长一段时间没有使用C ++,而且我似乎正在制作我确定是一个非常愚蠢的错误。有人可以告诉我为什么
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
double* atoms;
atoms = (double*)malloc(10 * 3*sizeof(double));
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
atoms[i*10 + j] = 2.0;
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
cout << atoms[i*10 + j] << endl;
}
cout << endl;
}
free(atoms);
return 0;
}
正在打印
2
2
2
2
2
2
2
2
2
6.94528e-310
6.94528e-310
0
0
4.24399e-314
4.24399e-314
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
而不是全部2?感谢
答案 0 :(得分:3)
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
atoms[i*10 + j] = 2.0;
我想,你想写:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
atoms[j*10 + i] = 2.0;
你在两个循环中都有同样的错误,确切地说,我认为很明显:)
答案 1 :(得分:1)
malloc(10 * 3*sizeof(double))
为30个双打分配足够的内存。
循环:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
atoms[i*10 + j] = 2.0;
}
}
远远超过最后分配的元素(可能是atoms[29]
)。例如,当i == 3
和j == 0
您正在访问atoms[30]
时。 i >= 3
越界时的任何访问。
答案 2 :(得分:0)
错误在你的周期内(两者都有):
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
atoms[i*10 + j] = 2.0;// <-- wrong index computation
}
}
在你的两个周期中应该是:
atoms[i*3 + j] = 2.0;
代替。每次迭代只输出i*10 + j
,你就会看到你的错误。您正尝试按此顺序访问元素:
0 1 2 10 11 12 20 21 22 30 31 32 40 41 42 50 51 52 60 61 62 70 71 72 80 81 82 90 91 92 2