2015-07-06 3 views
3

Мой вопрос, теперь приведенный к - надеюсь, - минимальный пример, поэтому следующий код segfaults.Где этот код segfault?

Это, конечно, можно рассматривать как дубликат предлагаемого вопроса, если вы нашли его. Проблема в том, что я не смог найти вопрос в своем первоначальном поиске, и поэтому может много новичков, не зная причины ошибки. Я предлагаю это как дубликат я мог бы найти:

Segmentation Fault before main

но описание проблемы очень долго, так что я считаю, что я минимизированы и намного короче код может быть лучше для иллюстрации проблемы. В любом случае это дубликат. Я предлагаю модераторам установить это как дубликат и установить ссылку со второго возможного дубликата на первый.

#include <stdio.h> 


/* Parameters */ 
#define N 3072 
#define LDA N 

/* Main program */ 
int main() { 
     printf("-----------------------------------------------> Entry main.\n"); 
     /* Local arrays */ 
    double a[LDA*N]; 
     printf("-----------------------------------------------> End main.\n"); 
return 0;   
} 

выдаёт ошибку сегментации не происходит, когда

#define N 3072 

заменяется

#define N 5 

Ни делает происходят, когда выдаёт ошибку сегментации линии

double a[LDA*N]; 

опускается.

Я особенно смущают наблюдением, что происходит, не доходя выдаёт ошибку сегментации

printf("-----------------------------------------------> Entry main.\n"); 

который я наношу непосредственно в начале основной.

Для полноты я запускаю код, как это:

[email protected]:~/Desktop/tests$ g++ -o minicombo.x minicombo.cc && ./minicombo.x 
+3

'std :: ifstream' Это ** NOT ** C – Eregrith

+0

@Eregrith Действительно ... Спасибо! – Ludi

+1

Если вы хотите отлаживать вывод, используйте 'std :: cerr' (или' fprintf (stderr, ... 'если вам нужно). –

ответ

5

выдаёт ошибку сегментации, вероятно, связано с определением массива double a[LDA*N];. Это создает массив размером 72 МБ с автоматическим временем хранения («в стеке»). У вас есть несколько альтернатив.

  1. Использовать std::vector<double> с желаемым размером или resize() Функция члена.
  2. Динамическое распределение с std::unique_ptr<double[]> или new[]/delete[]. Помните, что ручное управление памятью сопряжено с опасностью.
  3. Сделать массив static или глобальным.
+0

I не думайте, что это хорошая идея, чтобы научить новичков 'new []' и 'delete []'. И, конечно же, не используйте 'malloc' в C++! Также: Lulz, gif на странице вашего профиля. :) –

+1

@BaummitAugen: Хорошо, я добавил некоторые страшные слова к моему ответу. – Blastfurnace

+1

Я думаю, что этот ответ прав, поскольку я следил за предложением бета-версии и удалял что-либо внутри main(). Сегфата не было. Затем я добавил строки один за другим, и программа была исправлена ​​сразу, когда я добавил double [LDA * N]; Должен ли я переписать вопрос с минимальным примером сейчас? – Ludi

Смежные вопросы