Может кто-нибудь указать или дать подсказку о том, что происходит? Почему, когда я запускаю код по строкам с помощью встроенного отладчика, он дает правильный returnAry
, но падает, когда я пытаюсь выполнить программу?Код работает нормально через отладчик, но сбой при выполнении
Вот не мой код:
#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;
}
Спасибо заранее за вашу помощь, я действительно не могу понять, что происходит, это сводит меня с ума!
Ну ... неопределенное поведение в '* (digitInfoAry + i) = new int [sizeAry] {0};' 'digitInfoAry' выделяется' size == 4', но вы получаете доступ к 'sizeAray == 10' элементы. Кроме того: что не так с 'digitInfoAry [i] =', что делает его более читаемым? – dhke
Проблемы, подобные вашим, обычно вызваны записями вне границ. В разделе «Отладка» области памяти до и после массива обычно доступны (так что инструменты отладки памяти могут помещать канарейки для просмотра, если они будут сбиты). Вы используете C++, поэтому реальный вопрос: почему вы не используете 'std :: vector' вместо ручного управления хранилищем? – datenwolf
Вы также распределяете два массива и десять целых чисел динамически, но пропустите всю эту память. – user2079303