Почему при выводе массива исключение о повреждении кучи

Я использую следующий код

void func()
{
    int lenM = 4 * 4 * sizeof(int);
    int *miss = (int*)malloc(lenM));
    for(int i = 0;i < lenM;i++)
    {
        miss[i] = i;
    }
    for(int i = 0;i < 4;i++)
    {
        std::cout << miss[i * 4 + 0];
    }
}
int main()
{
    func();
}

Должен быть вывод

0
4
8
12

Но в последнем цикле func() у меня исключение ntdll о повреждении кучи


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

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

malloc принимает размер в байтах. Он ничего не знает о том, как результат будут использовать. У Вас памяти выделяется на 64 байта (на 16 интов), а потом в первом цикле заполняем 64 инта. Понятно, что первые 16 отработают как нужно, а остальные запишут за пределами массива. А запись за пределами массива - это UB, и выстрелить потом может где угодно. Исправленный вараинт.

void func()
{
    int lenM = 4 * 4;
    int *miss = (int*)malloc(lenM * sizeof(int));
    for(int i = 0;i < lenM;i++)
    {
        miss[i] = i;
    }
    for(int i = 0;i < 4;i++)
    {
        std::cout << miss[i * 4 + 0];
    }
    free(miss); // память нужно чистить!
}
int main()
{
    func();
}

Но если у вас плюсы, то пишите его по плюсовому, где то так

void func()
{
    int lenM = 4 * 4;
    int *miss = new int[lenM];
    for(int i = 0;i < lenM;i++)
    {
        miss[i] = i;
    }
    for(int i = 0;i < 4;i++)
    {
        std::cout << miss[i * 4 + 0];
    }
    delete[] miss;
}

А ещё лучше вот так

void func()
{
    int lenM = 4 * 4;
    std::vector<int> miss(lenM);
    for(int i = 0;i < lenM;i++)
    {
        miss[i] = i;
    }
    for(int i = 0;i < 4;i++)
    {
        std::cout << miss[i * 4 + 0];
    }
}
→ Ссылка