Передача параметра-указателя в функцию всегда выполняется по значению

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 шт):

Автор решения: LShadow77

Вы передаёте в функцию значение указателя, которое присваивается переменной-аргументу функции при её вызове. Так что аргумент ps - это копия того указателя, что вы передаёте. По сути вы меняете значение копии, а оригинал остаётся неизменным. А ещё это временный объект, который уничтожается при возврате из функци, и у вас происходит утечка памяти.

Если требуется поменять исходный указатель, то в Си это можно сделать двумя способами.

  1. Передать указатель на указатель, и присвоить значение исходному указателю через указатель на него:

    void fonction(s **pps) { *pps = (s*)malloc(sizeof(s)); }

Вызов будет выглядеть так:

s* ps;
fonction(&ps);
  1. Сделать так, чтобы функция возвращала новый указатель, который можно присвоить исходному:

    s* fonction() { return (s*)malloc(sizeof(s)); }

Тогда вызов будет выглядеть так:

s* ps = fonction();

И кстати, не fonction, а function)

→ Ссылка