Назначение параметров будет работать, только если вы установите значение для его address .
Есть 2 момента, которые вы должны знать, прежде чем пытаться решить эту проблему:
1. C Функция : Все параметры, которые вы передали в функцию, будут скопированы в функцию.
Это означает, что каждое присвоение, которое вы сделали в функции, не будет влиять на переменные вне функции, вы работаете над copy на самом деле:
int i = 1;
fun(i);
printf("%d\n", i);
//no matter what kind of changes you've made to i in fun, i's value will be 1
Итак, если вы хотите изменить i в функции, вам нужно знать разницу между вещью и ее копией:
Копия поделилась значением с вещью, но не адресом .
И в этом их единственное отличие.
Таким образом, единственный способ изменить i в функции - использовать адрес i.
Например, есть новая функция fun_addr:
void fun_addr(int *i) {
*i = some_value;
}
Таким образом, вы можете изменить значение i.
- malloc :
Ключевым моментом в функции fun_addr является то, что вы передали адрес функции. И вы можете изменить значение, хранящееся в этом адресе.
Что будет делать malloc?
malloc выделит новое пространство памяти, а вернет указатель, указывающий на этот адрес, обратно .
Посмотрите на эту инструкцию:
int *array = (int*) malloc(sizeof(int) * SIZE);
То, что вы делаете, - это пусть значение массива равно адресу, возвращенному malloc.
См? Это тот же вопрос, который постоянно присваивает значение параметру, передаваемому функции. На данный момент значение равно address
.
Теперь присвойте адрес (возвращаемый malloc) этому адресу (сохраняет старый адрес).
Так что код должен быть:
void fun_addr_addr(int **p) {
*p = (int*) malloc(sizeof(int) * SIZE);
}
Этот будет работать.