Получение исключительной ситуации говорит, что "project.exe вызвал точку останова" при попытке освободить выделенную память массива в C - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь освободить помощника. Все работает нормально, кроме бесплатного (помощник). Эта функция должна проверять, повторяются ли числа. Может кто-нибудь помочь мне найти проблему?

int check_array(int *arr, int n) {
int i, max = 0;
for (i = 0; i < n; i++)
    if (arr[i] > max) max = arr[i];

int *helper = (int*)malloc(sizeof(int) * max);
if (!helper) return;
i = 0;
while (i < max) helper[i++] = 0;
for (i = 0; i < n; i++)
    helper[arr[i]]++;

for (i = 0; i < max; i++) {
    while (!helper[i]) i++;
    if (helper[i] > 1) {
        free(helper);
        return 0;
    }
}
free(helper);

return 1;}

В основном это только для двух примеров.

void main() {
int arr[] = { 1,2,3,4,6,7,8,9,100,120,130,140,150 };
int arr2[] = { 1,2,3,4,8,7,8,9,100,120,130,140,150 };
int size_arr = sizeof(arr) / sizeof(arr[0]);
int size_arr2 = sizeof(arr2) / sizeof(arr2[0]);

printf("arr - %d\narr2 - %d\n", check_array(arr, size_arr), check_array(arr2, size_arr2));
}

1 Ответ

0 голосов
/ 07 мая 2018

Вы выделяете место для max целых чисел при вызове

int *helper = (int*)malloc(sizeof(int) * max);

Таким образом, вы можете индексировать helper только от 0 до max-1.

Затем вы увеличиваете: helper[arr[i]]++;. Но обратите внимание, что хотя бы одно значение arr[i] равно max. Поэтому вы индексируете вне границ и записываете в память, которой вы не владеете. Это вызывает неопределенное поведение, которое позже приводит к сбою, вызывая free.

...