Почему при выводе массива исключение о повреждении кучи
Я использую следующий код
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];
}
}