Ошибка 0xC0000005 на третьей итерации с++

При третей итерации получаю ошибку 0xC0000005, однако при первых двух итерациях всё работает нормально

#include <iostream>
#include <stdlib.h>

using namespace std;

int arr[1000];

int getRDX (int n, unsigned rdx) {
    return n-n/10/rdx*10-n+n/rdx;
}

void RadixSort (int *ptr, unsigned lenght) {
    //Amount of iterations
    unsigned iter_n = 1;

    //RDX counter
    unsigned rdx_c[10];

    //Auxiliary data
    int *backup = new int[lenght];
    int biggest = ptr[0];
    unsigned rdx_k = 1;

    //Calculating the amount of iterations
    for(unsigned i = 1; i < lenght; i++) {
        if(biggest < ptr[i]) {
            biggest = ptr[i];
        }
    }
    while(true) {
        biggest/=10;
        if(biggest == 0) {
            break;
        }
        iter_n++;
    }
    //Actual Sorting
    for(unsigned iter_c = 0; iter_c < iter_n; iter_c++) {
        //Resetting RDX counter
        for(unsigned i = 0; i < 10; i++) {
            rdx_c[i] = 0;
        }
        for(unsigned i = 0; i < lenght; i++) {
            rdx_c[getRDX(ptr[i], rdx_k)]++;
        }
        //Prefix Sum
        for(unsigned i = 1; i < lenght; i++) {
            rdx_c[i]+=rdx_c[i-1];
        }
        for(int i = lenght-1; i >= 0; i--) {
            backup[--rdx_c[getRDX(ptr[i], rdx_k)]] = ptr[i];
        }
        for(unsigned i = 0; i < lenght; i++) {
            ptr[i] = backup[i];
        }
        rdx_k*=10;
    }
    delete []backup;
}

int main() {
    for(unsigned i = 0; i < 1000; i++) {
        arr[i] = rand()%1000;
        //cout << arr[i] << endl;
    }
    RadixSort(arr, 1000);
    for(unsigned i = 0; i < 1000; i++) {
        //cout << arr[i] << endl;
    }
    return 0;
}

думаю, ошибка происходит где-то тут:

for(int i = lenght-1; i >= 0; i--) {
    backup[--rdx_c[getRDX(ptr[i], rdx_k)]] = ptr[i];
}

Ответы (1 шт):

Автор решения: Andrej Levkovitch

Во-первых хочу сказать: я бы давал по рукам за такой "код" - глобальные переменные, куча операций в одной строке, ужасное именование переменных и прочее.

Во-вторых, изучите дебагер.

В-третьих, изучите как располагаются переменные в памяти.

В-четвертых, освойте такие инструменты как valgrind и/или LeakSanitizer

Ну а теперь к проблеме: она выясняется практически сразу при включении санитайзера:

==28663==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc4466cf08 at pc 0x55de513a9668 bp 0x7ffc4466ce60 sp 0x
7ffc4466ce58
READ of size 4 at 0x7ffc4466cf08 thread T0
    #0 0x55de513a9667 in RadixSort(int*, unsigned int) /home/levkovitch/a.cpp:46
    #1 0x55de513a9ab2 in main /home/levkovitch/a.cpp:67
    #2 0x7f549d74809a in __libc_start_main ../csu/libc-start.c:308
    #3 0x55de513a9169 in _start (/home/levkovitch/a.out+0x1169)

Address 0x7ffc4466cf08 is located in stack of thread T0 at offset 72 in frame
    #0 0x55de513a927c in RadixSort(int*, unsigned int) /home/levkovitch/a.cpp:10

  This frame has 1 object(s):
    [32, 72) 'rdx_c' <== Memory access at offset 72 overflows this variable

Как видим вы вылазите за пределы выделенной памяти при использовании переменной rdx_c в строке 46. Посмотрим что там:

    for (unsigned i = 1; i < lenght; i++) {
      rdx_c[i] += rdx_c[i - 1];
    }

А теперь посмотрим что это за rdx_c:

  unsigned rdx_c[10];

И это при том, что length у вас равно 1000.

→ Ссылка