Присвоение массива небольших строк вызывает ошибку сегментации - PullRequest
0 голосов
/ 16 августа 2010

Мой оригинальный код (следующий) выдает ошибку сегмента при назначении массива строк примерно с num_atoms = 150,000:

int num_atoms=dimension[0]*dimension[1]*dimension[2]*prim_lat.size();
double superlat[num_atoms][3];
string current_occ[num_atoms];

Думая, что это был первый случай, когда я столкнулся с проблемой переполнения стека, и думал, что выМожно назначить кучу с помощью динамического выделения, я попытался:

int num_atoms=dimension[0]*dimension[1]*dimension[2]*prim_lat.size();
double superlat[num_atoms][3];
string *current_occ = new string[num_atoms];

Этот код дал сбой сегмента около num_atoms = 350 000.Я не уверен, что обойти эту проблему.Это только тот случай, когда мне нужно увеличить предел стека / кучи?Если да, могу ли я сделать это как параметр gcc?

1 Ответ

0 голосов
/ 16 августа 2010

Вы все еще храните superlat в стеке во втором примере.Вы также можете переместить его в кучу.

Скорее всего, именно это и вызывает проблему, поскольку в первом примере вы храните указатели num_atoms x2 в стеке (один указатель на string,один указатель на массив double), а во втором хранятся указатели num_atoms x1 в стеке (только один на массив double), поэтому число атомов до сегфоута удвоилось.

...