Аргументы функции внутри функции

#c #function #pointers #reference #structure

#c #функция #указатели #ссылка #структура

Вопрос:

У меня есть следующий код:

 include <stdlib.h>

typedef struct foo{
    int x;
}Foo;

void funcY(Foo *f1)
{
    printf("%d", f1.x);
}

void funcX(Foo *f1)
{
    printf("%d", f1.x);
    funcY(f1);            <---- is this correct?
}

int main()
{
    Foo *foo1 = (struct foo *)malloc(sizeof(struct foo));
    foo1.x = 10;
    funcX(foo1); 
    return 0;
}
  

Я не знаю точно, как обозначить эту проблему. Каков наилучший способ для меня подойти к этому?

Комментарии:

1. Каково предполагаемое поведение? Работает ли это так, как задумано? Что происходит, когда вы пытаетесь скомпилировать и запустить его, и чем это отличается от того, что вы хотите?

Ответ №1:

 funcY(f1);            <---- is this correct?
  

Да, эта конкретная строка верна. Однако есть несколько других частей, которые этого не делают: в частности, для доступа struct к элементам по указателю требуется -> оператор, а не точка:

 printf("%d", f1->x);
  

Еще одна небольшая проблема заключается в том, что не следует приводить malloc в C:

 Foo *foo1 = malloc(sizeof(struct foo));
  

Наконец, вам не хватает вызова free(foo) для освобождения malloc памяти. Обратите внимание, что вам не нужно использовать malloc — выделять struct в автоматическом хранилище и использовать amp; для доступа к его адресу:

 int main()
{
    Foo foo1;
    foo1.x = 10;
    funcX(amp;foo1); 
    return 0;
}
  

Комментарии:

1. Спасибо! Я спешил и не уловил свои ошибки.

Ответ №2:

funcY(f1) правильно — он передает Foo указатель на funcY , и поскольку funcY принимает Foo указатель, мы можем предположить, что он будет работать по назначению.

printf("%d", f1.x); , однако, неверно. f1 является Foo указателем, а не a Foo . Чтобы получить доступ к этому x полю, вам нужно сначала (*f1).x разыменовать его — или использовать sytactic sugar f1->x .