Как динамически выделить массив в функции? - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь динамически выделить массив, переданный через параметр в функции dynamic_allocation_array, и я не понимаю, почему он не работает.

#include <stdio.h>
#include <stdlib.h>
void dynamic_allocation_array(int **a, int n){

    (*a) = (int *)malloc(n * sizeof(int *));
    for(int i = 0; i < n; i++){
        scanf("%d", *(a + i));
    }

}
int main()
{
    int n, *a;
    scanf("%d", &n);
    dynamic_allocation_array(&a, n);
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

*(a + i) недействительно.Сначала необходимо * разыменовать указатель a, а затем добавить + i.a указывает на некоторую переменную, в a + i нет.Вы выделили память на (*a) + i.

Также вы хотите выделить память для n подсчета int с, а не для n указателей на int.Вы хотите: malloc(n * sizeof(int)).

Используйте временную переменную, не используйте *(a + b), просто используйте a[b] запись, сделайте ее более понятной:

void dynamic_allocation_array(int **a, int n) {
    int *tmp = malloc(n * sizeof(int));
    for(int i = 0; i < n; i++){
        scanf("%d", &tmp[i]);
    }

    *a = tmp;
}

или вы можете:

void dynamic_allocation_array(int **a, int n) {
    *a = malloc(n * sizeof(int));
    for(int i = 0; i < n; i++){
        scanf("%d", &(*a)[i]);
    }
}

или вы можете:

void dynamic_allocation_array(int **a, int n) {
    *a = malloc(n * sizeof(int));
    for(int i = 0; i < n; i++){
        scanf("%d", *a + i);
    }
}
2 голосов
/ 05 мая 2019

Я бы не использовал двойные указатели, так как здесь 100% не требуется

int *dynamic_allocation_array(size_t size)
{
      int *a = malloc(size * sizeof(*a));
       /* another code */
      return a;
}

и в вызывающей функции

int *a = dynamic_allocation_array(some_size);

...