c++ - 检查数组索引后程序崩溃
问题描述
请注意:我不确定这是否适合这里,如果不适合,请转到正确的论坛。
所以我有一个程序试图解决旅行商问题,简称 TSP。
我的代码似乎运行良好,直到我尝试使用 33810 个城市,其中程序在尝试访问位置成本 [69378120] 后崩溃,它只是停止响应并很快结束。
我正在尝试以下代码:
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#include <fstream>
#include <math.h>
#include <vector>
#include <limits>
using namespace std;
typedef long long int itype;
int main(int argc, char *argv[]) {
itype n;
ifstream fenter;
fenter.open(argv[1]);
ofstream fexit;
fexit.open(argv[2]);
fenter>> n;
double *x;
double *y;
x = (double*) malloc(sizeof(double)*n);
y = (double*) malloc(sizeof(double)*n);
cout<<"N : "<<n<<endl;
for (int p = 0; p < n; p++) {
fenter>> x[p] >> y[p];
}
fenter.close();
int *costs;
costs = (int*) malloc(sizeof(int)*(n*n));
for (int u = 0; u < n; u++) {
for (int v = u+1; v < n; v++) {
itype cost = floor(sqrt(pow(x[u] - x[v], 2) + pow(y[u] - y[v], 2)));
cout<<"U: "<<u<<" V: "<<v<<" COST: "<<cost<<endl;
costs[u*n + v] = cost;
cout<<"POS (u*n + v): "<<(u*n + v)<<endl;
cout<<"POS (v*n + u): "<<(v*n + u)<<endl;
costs[v*n + u] = cost;
}
}
return 0;
}
根据一些验证,成本数组应该使用 9.14493GB,但 Windows 仅给出 0.277497GB。然后在尝试读取成本 [69378120] 后,它会关闭。目前,我不担心效率,也不担心 TSP 的解决方案,只需要解决这个问题。有什么线索吗?
---更新---按照我的建议,我尝试改变一些事情。结果是下面的代码
int main(int argc, char *argv[]) {
int n;
ifstream entrada;
entrada.open(argv[1]);
ofstream saida;
saida.open(argv[2]);
entrada >> n;
vector<double> x(n);
vector<double> y(n);
for (int p = 0; p < n; p++) {
entrada >> x[p] >> y[p];
}
entrada.close();
vector<itype> costs(n*n);
if(costs == NULL){ cout << "Sem memória!" << endl; return -1;}
for (int u = 0; u < n; u++) {
for (int v = u+1; v < n; v++) {
itype cost = floor(sqrt(pow(x[u] - x[v], 2) + pow(y[u] - y[v], 2)));
costs[u*n + v] = cost;
costs[v*n + u] = cost;
}
}
return 0;
}
问题依然存在
解决方案
如果在 32 位中编译 size_t 是 32 位然后
1143116100*4
大于最大的 32 位数字,因此 int 溢出。
64位编译
size_t siz = 1143116100;
std::vector<long long> big(siz);
std::cout << big.size() << ", " << big.max_size() << std::endl;
哪个打印
1143116100, 2305843009213693951
如果我将其更改为
size_t siz = 1024*1143116100;
我得到一个 bad_alloc,因为我的交换磁盘不够大。
推荐阅读
- c++ - 插入功能不会添加新元素
- c# - C# linq 查询聚合可为空的布尔值
- excel - 如何在更改单元格颜色或以特定间隔自动计算工作表?
- excel - How do I sum a variable range?
- typescript - 如何创建自定义色标?
- python - python selenium webdriver在登录网站时获取httpStatusCode 503
- xquery - XQuery 中的复杂类型检查
- c - 根据上下文指向内存中的函数 - 多态性
- python - 如何在 scikit-learn 中正确执行交叉验证?
- reactjs - React Navigation v3 - 选项卡图标 - 问号而不是图标