int input(int *arr, int *n) {
if (scanf("%d", n) != 1) return -1;
arr = (int*)malloc(sizeof(*arr) * *n);
if (arr == NULL) return -1;
for (int i = 0; i < *n; ++i) {
if (scanf("%d", arr[i]) != 1) return -1;
}
return 0;
}
int main(void) {
int *arr = NULL;
int n = 0;
input(arr, &n);arr = (int*)malloc(sizeof(*arr) * *n);Здесь вы меняете значение переменной arr, но это изменённое значение не выйдет за пределы функции. Нужно передавать в функцию ссылку на переменную и изменять значение по этой ссылке. То, что переменная arr сама является ссылкой ничего принципиально не меняет.int input(int **arr, int *n) {
if (scanf("%d", n) != 1) return -1;
*arr = (int*)malloc(sizeof(int) * *n);
if (*arr == NULL) return -1;
for (int i = 0; i < *n; ++i) {
if (scanf("%d", (*arr)[i]) != 1) return -1;
}
return 0;
}
int main(void) {
int *arr = NULL;
int n = 0;
input(&arr, &n); arr[i] = что-то и arr = malloc() — принципиально разные операции. Первое меняет данные по адресу (туда, куда указатель смотрит), это видно из main. Второе меняет сам указатель, а он в функции — локальная копия.int **arr и *arr = malloc() — передаёшь адрес самого указателя и меняешь его через разыменование. int input(int &*arr, int &n)arr=(int*)malloc(...)input(int *arr, - тут вы передали в функцию указатель. Адресс.arr = (int*)malloc(sizeof(*arr) * *n); тут вы перезаписали это значение на новое. void input(int arr) {
arr = 10;
}
int main() {
int x = 0;
input(x);
return 0;
}int *arr - указатель на int. * говорит, что это ардес, по которому лежит что-то. В данном случае int. ТЕсли вы хотите вернуть значение из функции, вам надо одно из:int **arr в аргументах функции. Тогда вы сможете из функции менять массив int *