Передача параметра-указателя в функцию всегда выполняется по значению
typedef struct
{
char c;
} s;
void fonction(s * ps)
{
ps = (s *)malloc(sizeof(s));
}
Код упрощён. Правильно ли я понимаю, что так делать не правильно? Как тогда поменять переданную структуру в функции? В функцию была передана копия адреса структуры? Malloc вернёт указатель, присвоит его локальной переменной, но почему структура не поменяется, не понимаю, ведь у локальной переменной тот же адрес, или нет? Объясните, пожалуйста, что происходит, и как правильно.
Обновление
void function (s ** pps)
{
s new[10];
initialize_array(new);
*pps = (s *)realloc(pps, 10 * sizeof(s));
}
int main(void)
{
s * ps;
initialize_array1(ps);
function(&ps);
free(ps);
}
Ответы (1 шт):
Вы передаёте в функцию значение указателя, которое присваивается переменной-аргументу функции при её вызове. Так что аргумент ps - это копия того указателя, что вы передаёте. По сути вы меняете значение копии, а оригинал остаётся неизменным. А ещё это временный объект, который уничтожается при возврате из функци, и у вас происходит утечка памяти.
Если требуется поменять исходный указатель, то в Си это можно сделать двумя способами.
Передать указатель на указатель, и присвоить значение исходному указателю через указатель на него:
void fonction(s **pps) { *pps = (s*)malloc(sizeof(s)); }
Вызов будет выглядеть так:
s* ps;
fonction(&ps);
Сделать так, чтобы функция возвращала новый указатель, который можно присвоить исходному:
s* fonction() { return (s*)malloc(sizeof(s)); }
Тогда вызов будет выглядеть так:
s* ps = fonction();
И кстати, не fonction, а function)