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