Вам нужно избавиться от malloc()
, он не принадлежит, поскольку main()
уже выделил память для своей локальной переменной f
. init_foo()
просто необходимо заполнить существующую память. Вызывая malloc()
, вы меняете указатель foo*
внутри init_foo()
, чтобы он указывал на другую память, игнорируя исходную память, которая была передана.
Попробуйте вместо этого:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
void init_foo(struct foo* f) {
f->bar = 5;
printf("bar0: %d\n", f->bar);
}
void print_foo(struct foo* f) {
printf("bar1: %d\n", f->bar);
}
int main() {
struct foo f;
init_foo(&f);
print_foo(&f);
}
С другой стороны, если вы хотите init_foo()
выделить память для структуры, сделайте это вместо этого:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
void init_foo(struct foo** f) {
*f = malloc(sizeof(struct foo));
if (f) {
(*f)->bar = 5;
printf("bar0: %d\n", (*f)->bar);
}
}
void free_foo(struct foo* f) {
free(f);
}
void print_foo(struct foo* f) {
printf("bar1: %d\n", f->bar);
}
int main() {
struct foo *f;
init_foo(&f);
if (f) {
print_foo(f);
free_foo(f);
}
}
Или это:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
struct foo* init_foo() {
struct foo *f = malloc(sizeof(struct foo));
if (f) {
f->bar = 5;
printf("bar0: %d\n", f->bar);
}
return f;
}
void free_foo(struct foo* f) {
free(f);
}
void print_foo(struct foo* f) {
printf("bar1: %d\n", f->bar);
}
int main() {
struct foo *f = init_foo(&f);
if (f) {
print_foo(f);
free_foo(f);
}
}