Ошибка сегментации при попытке создать массив - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
void init(int* arr, int n) {
arr = malloc(n * sizeof(int));
int i;
for (i = 0; i < n; ++i)
arr[i] = i;
}
int main() {
int* arr = NULL;
int n = 10;
init(arr, n);
int i;
for (i = 0; i < n; ++i)
printf("%d\n", arr[i]);
return 0;
}Решение задачи: «Ошибка сегментации при попытке создать массив»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void init(int **arr, int n) {
*arr = (int*)malloc(n * sizeof(int));
int i;
for (i = 0; i < n; ++i)
{
*(*arr + i) = i;
}
}
int main() {
int *arr = NULL;
int n = 10;
init(&arr, n);
int i;
for (i = 0; i < n; ++i)
printf("%d\n", arr[i]);
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с памятью и вводом/выводом данных.
- Создание функции
init, которая принимает указатель на указатель целых чисел и их количество. Внутри функции происходит выделение памяти под массив с помощьюmallocи присвоение указателя на первый элемент массива переменнойarr. Затем происходит инициализация каждого элемента массива значением равным его индексу. - Создание функции
main, которая инициализирует указательarrкакNULL, задаёт размер массива равным 10 и вызывает функциюinitпередавая ей указатель наarrи его размер. - В цикле до 10 раза выводится значение каждого элемента массива с помощью
printf. - В конце программы возвращается 0, что означает успешное завершение работы программы.