Классический стек переполнен? - PullRequest
1 голос
/ 20 января 2012

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

Я программирую рекурсивную функцию, которая создает дерево kd дляпроцесс поиска.Я использую язык c на Visual Studio '08.После нескольких секунд обработки выполнение программы останавливается из-за ошибки, а именно:

Необработанное исключение при 0x77063de7 в run_FAST_corner_detection.exe: 0xC00000FD: переполнение стека

Теперь, когдаразрывы кода, рядом с инструкцией есть зеленая стрелка:

kd_node = malloc(sizeof(struct kd_node));
//this function allocates a pointer to a reserved memory of size struct kd_node.

Это классическая проблема нехватки памяти?Как я могу контролировать память стека?(Я знаю, что этот вопрос задавался неоднократно, но, честно говоря, я пока не нашел хорошего способа сделать это).

Ответы [ 2 ]

1 голос
/ 20 января 2012

Чтобы отслеживать использование стека, просто возьмите адрес любой локальной переменной (определенной в функции) и сравните его с адресом локальной переменной в вашей основной функции (или функции ввода потока):

int stack_bottom;

int stack-usage () {
  int top = 0;

  /* Note, stack grows downward through memory, so high - low is .. */
  return stack_bottom - (int)⊤
}

....

int main () {
  int bottom = 0;

  stack_bottom = (int)⊥

  ....
}

Чтобы уменьшить использование стека, либо ограничьте рекурсию, либо избегайте использования больших локальных переменных (таких как структуры, массивы) и не используйте alloca.Вы можете заменить большую локальную переменную указателями на динамически распределенную память кучи (но не забудьте освободить ее!)

1 голос
/ 20 января 2012

Что ж, переполнение стека может быть связано с тем, что вы вызываете malloc, находясь глубоко в рекурсии.Вызов malloc выдвигает адрес возврата и, возможно, даже параметры в стеке, и это может быть причиной переполнения стека.Не делайте рекурсии в своем коде - попробуйте сделать код итеративным (вместо циклов).Это особенно верно для случаев, когда рекурсия не ограничена.

...