2013-10-11 53 views
0

問題標題可能看起來很奇怪,但這似乎是我的代碼中的一個奇怪的錯誤,我無法弄清楚。與std :: cin一起使用二維雙數組給出奇怪的SEGFAULT

 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 } 

2-d雙陣列的聲明使我在gdb執行下一個std::cin.getline()語句時得到以下錯誤:

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(); 

這似乎很好地工作,如果我只用extern dist變量。如果我保留distance的聲明,但不要在第30行中使用它,它也可以很好地工作。當然,這只是我的大型tsp.cc文件的代碼片段。如果有人需要更多信息,我很樂意提供。我只希望自己在睡眠不足的狀態下沒有錯過任何明顯的事情。 :)

我使用gcc版本4.7.3(Ubuntu的/ Linaro的4.7.3-1ubuntu1)

+0

在行'std :: cin >> distance [i] [j];'它是否正確運行了一段時間,然後最終崩潰或在第一個循環中崩潰 – SirGuy

+0

實際上遇到行std :: cin.getline(buf,20)本身沒有進入循環。我想peterept給出的答案似乎持有水 – krypto07

回答

1

double distance[MAX_CITIES][MAX_CITIES]陣列被分配在堆棧上,並導致程序崩潰的東西時的訪問內存中的功能。

這不會發生在函數外部,因爲編譯器/鏈接器會在堆中分配該塊。

的解決方案是動態地分配存儲器(最簡單的是單塊):

double *distance = new double[MAX_CITIES*MAX_CITIES]; 

some_value = distance[(i*MAX_CITIES)+j]; 

delete[] distance; 

當然,這還是可能會失敗,如果MAX_CITIES是大的,所以然後處理失敗正常。

+0

你的意思是說我超過了我的堆棧限制嗎?這似乎是一個有效的解釋。感謝一噸。只是爲了爭論有什麼方法可以改變我的函數可用的堆棧空間量? – krypto07

+0

我通過使用ulimit -s來增加堆棧空間限制後測試了我的代碼,代碼工作正常。 – krypto07