Чтение недоступных данных из массива и переполнение буфера при записи в этот массив

Хочу отсортировать массив длиной length, которую ввожу с клавиатуры, но выдает предупреждение C6385 об чтении недопустимых значение из массива n: допустимый для чтения обьем равен "length * 4" байт, однако считать можно только "8" байт. Также выдает предупреждение C6386 об переполнении буфера при записи массива n: допустимый для чтения обьем равен "length * 4" байт, однако считать можно только "8" байт. При выводе елементов отсортированного массива, большенство их не выводится. Обьясните пожалуйста как исправить ошибку в коде.

{
    int* n, e, t, length;
    scanf_s("%d", &length);
    n = new int[length];
    srand(time(NULL));
    for (int i = 0; i < length; i++) 
    {
        n[i] = rand() % 100;
        printf("%d\n", n[i]);
    }
    do 
    {
        t = 0;
        for (int i = 1; i <= sizeof(*n) / sizeof(n[0]); i++) 
        {
            if (n[i] < n[i - 1]) 
            {
                e = n[i - 1];
                n[i - 1] = n[i];
                n[i] = e;
                t = 1;
            }
        }
    } while (t);
    printf("Sorted array\n");
    for (int i = 0; i <= sizeof(*n) / sizeof(n[0]); i++) 
    {
        printf("%d\n", n[i]);
    }
}

введите сюда описание изображения

введите сюда описание изображения


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

Автор решения: AlexGlebe

При выделении памяти массиву в Си/Си++ размер памяти и количество элементов официально компилятор может не хранить. Работать с количеством элементов выделенной памяти отдано на выбор программистов.

В вашем коде количество храниться в length. Им и пользуйтесь.

Ошибка у вас с индексами. Они должны быть от 0 до length-1.

for (int i = 1; i <= sizeof(*n) / sizeof(n[0]); i++)

правильно так :

for (int i = 1; i < length ; i++)
→ Ссылка