代码在调试器中运行良好,但在执行时崩溃

时间:2015-11-19 07:27:28

标签: c++ debugging

有人可以指出或暗示正在发生什么事吗?为什么当我使用内置调试器逐行运行代码时,它会提供正确的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;
}

提前感谢您的帮助,我真的无法弄清楚发生了什么,这让我疯了!

1 个答案:

答案 0 :(得分:3)

尝试解决此问题:

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

然后循环从0sizeAry索引超出了已分配的内存。