Правильно ли создается и уничтожается массив в приведенном коде - C (СИ)
Формулировка задачи:
Привет всем! Я начал изучать C, и хочется разобраться с массивами. Вот составил такой код:
Скажите правильно ли я создаю и убиваю двумерный массив double'ов? Про array[][] я слышал, но интересно понять что реально из себя представляют массивы, к тому же у Шилдта написано, что работа с указателями быстрее чем индексация.
int main()
{
double** array = malloc(10 * sizeof(double*));
for (int i = 0; i < 10; i++) *(array + i) = malloc(10 * sizeof(double));
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
*(*(array + i) + j) = i + j;
// какой-то код
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
realloc(*(array + i) + j, 0);
array = realloc(array + i, 0); // чтобы array == NULL
}
return 0;
}Решение задачи: «Правильно ли создается и уничтожается массив в приведенном коде»
textual
Листинг программы
...
int ** arr, rows, columns, i, j;
...
if ( ( arr = (int**)malloc(sizeof(int*) * rows) ) == NULL ){
perror("malloc");
exit(1);
}
for ( i = 0; i < rows; ++i ){
if ( ( arr[i] = (int*)malloc(sizeof(int) * columns) ) == NULL ){
perror("malloc");
exit(1);
}
}
for ( i = 0; i < rows; ++i )
for ( j = 0; j < columns; ++j )
arr[i][j] = rand() % 10; /* заполнение случайными числами */
...
for ( i = 0; i < rows; ++i )
free(arr[i]);
free(arr);
...
Объяснение кода листинга программы
- Объявлены переменные:
arr- указатель на массив указателей на целочисленные значения (int**);rows- количество строк (целое число);columns- количество столбцов (целое число);i- счётчик для прохода по строкам;j- счётчик для прохода по столбцам.
- Выделена память под массив указателей на int с помощью функции
malloc. Если выделение памяти не удалось, то выводится сообщение об ошибке и программа завершается. - В цикле выделена память под массив int для каждой строки с помощью функции
malloc. Если выделение памяти не удалось, то выводится сообщение об ошибке и программа завершается. - В двухмерном цикле массив
arrзаполняется случайными числами от 0 до 9 с помощью функцииrand(). - В цикле освобождается память, выделенная под каждый элемент массива
arr[i], с помощью функцииfree(). - Освобождается память, выделенная под массив
arr, с помощью функцииfree().