C++11 使用带有std::cin的二维双数组会产生错误
问题标题可能看起来很奇怪,但这似乎是我的代码中一个奇怪的错误,我无法完全理解C++11 使用带有std::cin的二维双数组会产生错误,c++11,segmentation-fault,gcc4.7,C++11,Segmentation Fault,Gcc4.7,问题标题可能看起来很奇怪,但这似乎是我的代码中一个奇怪的错误,我无法完全理解 1 #include "linkern.h" 2 #include "linkern-inl.h" 4 #include <iostream> 5 #include "tsp.h" //contains macro MAX_CITIES 6 7 extern bool euclidean; 8 extern double
1 #include "linkern.h"
2 #include "linkern-inl.h"
4 #include <iostream>
5 #include "tsp.h" //contains macro MAX_CITIES
6
7 extern bool euclidean;
8 extern double dist[MAX_CITIES][MAX_CITIES];
9
10 void LinKernighan::inputData()
11 {
12 char buf[20];
13 int no_cities;
14 double coords[MAX_CITIES][2];
15 double distance[MAX_CITIES][MAX_CITIES]; //works fine if this is commented out
16 std::cin.getline(buf, 20);
17 if (buf[0] == 'e') // if euclidean TSP
18 euclidean = true;
19 else
20 euclidean = false;
21 std::cin>>no_cities;
22 Tour::NUM_CITIES = no_cities;
23 nearest_neighbours.reserve(Tour::NUM_CITIES);
24 for (int i=0; i<Tour::NUM_CITIES; i++)
25 std::cin>>coords[i][0]>>coords[i][1];
26 for (int i=0; i<Tour::NUM_CITIES; i++)
27 {
28 for (int j = 0; j < Tour::NUM_CITIES; ++j)
29 {
30 std::cin>>distance[i][j]; //works fine if this is commented out
31 //dist[i][j] = round(dist[i][j]);
32 }
33 }
34 }
如果我只使用extern dist
变量,它似乎可以正常工作。如果我保留距离的声明,但不在第30行中使用它,那么它也可以完美地工作。当然,这只是我较大的tsp.cc文件的代码片段。如果有人需要更多的信息,我很乐意提供。我只是希望在我睡眠不足的状态下,我没有错过一些明显的东西
我使用的是gcc版本4.7.3(Ubuntu/Linaro 4.7.3-1ubuntu1)堆栈上分配了双距离[MAX\u CITIES][MAX\u CITIES]
数组,当有东西访问函数中的内存时,会导致程序崩溃
这不会发生在函数外部,因为编译器/链接器在堆中分配该块
解决方案是动态分配内存(最简单的是单个块):
当然,如果MAX_CITIES较大,这仍然可能失败,因此请优雅地处理故障。在std::cin>>distance[i][j]行代码>它是否正确地运行了一段时间,然后最终崩溃,还是在第一个循环中崩溃?实际上,它在遇到std::cin.getline(buf,20)行本身时崩溃,而从未到达循环。我认为彼得雷普特给出的答案似乎站得住脚。你的意思是说我超出了我的堆栈限制吗?这似乎是一个合理的解释。吨。为了便于讨论,是否有某种方法可以更改函数可用的堆栈空间量?在使用ulimit-s增加堆栈空间限制后,我测试了代码,代码运行良好。
Program received signal SIGSEGV, Segmentation fault.
0x000000000040245e in widen (__c=10 '\n', this=0x7ffff7dd7d60) at /usr/include/c++/4.7/bits/locale_facets.h:871
871 this->_M_widen_init();
double *distance = new double[MAX_CITIES*MAX_CITIES];
some_value = distance[(i*MAX_CITIES)+j];
delete[] distance;