#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
.