2015-11-19 2 views
0

Может кто-нибудь указать или дать подсказку о том, что происходит? Почему, когда я запускаю код по строкам с помощью встроенного отладчика, он дает правильный returnAry, но падает, когда я пытаюсь выполнить программу?Код работает нормально через отладчик, но сбой при выполнении

Нет отладчик: enter image description here

С отладчика: enter image description here enter image description here

Вот не мой код:

#include <iostream> 
#include "fraction.h" 
#include "fractionUtilities.h" 
using namespace std; 

int* getUncommon(Fraction*, int); 

int main() { 
    Fraction testAry[] = { 1201, 6266, 35, 77 }; 
    int size = 4; 
    int* result; 
    result = getUncommon(testAry, size); 

    for (int i = 0; i < result[0] + 1; i++) { 
     cout << result[i] << endl; 
    } 
    return 0; 
} 

int* getUncommon(Fraction* ary, int size) { 
    int* returnAry = 0; 
    int tmp; 
    int** digitInfoAry = new int*[size]; 
    int i, j; 
    int sizeAry = 10; 
    int digitAry[10]{ 0 }; 
    int uncommonDigitCount = 0; 

    for (i = 0; i < sizeAry; i++) { 
     *(digitInfoAry + i) = new int[sizeAry] {0}; 
    } 

    for (i = 0; i < size; i++) { 
     tmp = (ary + i)->getNum() < 0 ? -(ary + i)->getNum() : (ary + i)->getNum(); 

     do { 
      *(*(digitInfoAry + i) + tmp % 10) = 1; 
      tmp /= 10; 
     } while (tmp != 0); 
    } 

    for (i = 0; i < sizeAry; i++) { 
     for (j = 0; j < size; j++) { 
      digitAry[i] += *(*(digitInfoAry + j) + i); 
     } 
    } 

    for (i = 0; i < sizeAry; i++) { 
     if (digitAry[i] == 1) { 
      uncommonDigitCount++; 
     } 
    } 

    returnAry = new int[uncommonDigitCount + 1]; 
    *returnAry = uncommonDigitCount; 

    if (uncommonDigitCount != 0) { 
     for (i = 0, j = 1; i < sizeAry; i += 2) { 
      if (digitAry[i] % 2 == 1) { 
       returnAry[j] = i; 
       j++; 
      } 
     } 

     for (i = 1; i < sizeAry; i += 2) { 
      if (digitAry[i] % 2 == 1) { 
       returnAry[j] = i; 
       j++; 
      } 
     } 
    } 

    return returnAry; 
} 

Спасибо заранее за вашу помощь, я действительно не могу понять, что происходит, это сводит меня с ума!

+0

Ну ... неопределенное поведение в '* (digitInfoAry + i) = new int [sizeAry] {0};' 'digitInfoAry' выделяется' size == 4', но вы получаете доступ к 'sizeAray == 10' элементы. Кроме того: что не так с 'digitInfoAry [i] =', что делает его более читаемым? – dhke

+1

Проблемы, подобные вашим, обычно вызваны записями вне границ. В разделе «Отладка» области памяти до и после массива обычно доступны (так что инструменты отладки памяти могут помещать канарейки для просмотра, если они будут сбиты). Вы используете C++, поэтому реальный вопрос: почему вы не используете 'std :: vector' вместо ручного управления хранилищем? – datenwolf

+1

Вы также распределяете два массива и десять целых чисел динамически, но пропустите всю эту память. – user2079303

ответ

3

Попробуйте это исправить:

int** digitInfoAry = new int*[size]; 
... 
for (i = 0; i < sizeAry; i++) { 
    *(digitInfoAry + i) = new int[sizeAry] {0}; 
} 

Затем цикл выполняется от 0 до sizeAry индексов выходит за пределы выделенной памяти.

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