Правильный способ освобождения динамически выделенной памяти - освободить ее после того, как вы проверите, была ли она выделена в самом первом месте или нет.Поскольку ваша структура цикла одинакова для распределения и освобождения, здесь не возникнет никаких проблем, если все распределения успешны.Поэтому я рекомендую вам проверить во всех местах, успешно ли выделено после выделения, а также проверить, выделяется ли память перед освобождением.
Следующий код проверит все случаи:
scanf(" %d", &num);
/*
* check here if the value of ctr in non-negative and in the appropriate range
*/
temps[ctr] = (int*)malloc(num * sizeof(int));
if (temps[ctr] == NULL) {
printf ("Memory allocation failed\n");
/*
* appropriate error handling
*/
}
Кроме того, проверьте, когда вы освобождаете память, чтобы она была более безопасной.
for(ctr = 0; ctr < 3; ctr++)
{
if(temps[ctr]) {
free(temps[ctr]);
}
}
Также есть ошибка в вашем коде, когда после самой первой итерации вы получаете память из связанной ошибки, какпеременная ctr2
никогда не инициализируется.
num2 += num;
while(ctr2 < num2)
{
puts(" what is reading? ");
scanf(" %d", &temps[ctr][ctr2]);
printf("echo: %d ", temps[ctr][ctr2]);
ctr2++;
}
Здесь, если значение num
было 20 на первой итерации, то на второй итерации вы в конечном итоге получите входные данные, начиная с temps[1][20]
и принимая значение num
во второй итерации, равной 5, вы выделили всего 5 * sizeof(int))
, поэтому очевидно, что вы выходите за пределы, когда пытаетесь получить доступ к temps[1][20]
.