История изменений
Исправление balsoft, (текущая версия) :
Даже для C это элементарная задача
И, если что, в C вернуть указатель но function-local memory это UB. Может показаться, что это работает, но на самом деле нет!
Вот твой пример, переписанный 1-в-1 на C:
#include <stdio.h>
#include <stdlib.h>
struct A {
int i;
};
struct B {
struct A * a;
};
struct B create_b(int i) {
struct A a = { i };
struct B b = { &a };
return b;
}
int main() {
struct B b = create_b(10);
printf("%d\n", b.a->i);
void * foo = malloc(1000);
printf("%d\n", b.a->i);
free(foo);
}
Наблюдаем и наслаждаемся:
$ clang -O0 main.c -o main && ./main
10
0
$ clang main.c -o main && ./main
257812584
0
$ gcc -O0 main.c -o main && ./main
10
32615
$ gcc main.c -o main && ./main
0
0
$ ./main
1009871352
0
$ ./main
1940232856
0
$ ./main
-628805544
0
$ ./main
-1315733560
0
$ ./main
-998120824
0
Так что то что раст не дает тебе так сделать звучит как огромное преимущество.
Исходная версия balsoft, :
Даже для C это элементарная задача
И, если что, в C вернуть указатель но function-local memory это UB. Может показаться, что это работает, но на самом деле нет!
Вот твой пример, переписанный 1-в-1 на C:
#include <stdio.h>
#include <stdlib.h>
struct A {
int i;
};
struct B {
struct A * a;
};
struct B create_b(int i) {
struct A a = { i };
struct B b = { &a };
return b;
}
int main() {
struct B b = create_b(10);
printf("%d\n", b.a->i);
void * foo = malloc(1000);
printf("%d\n", b.a->i);
free(foo);
}
Наблюдаем и наслаждаемся:
$ clang -O0 main.c -o main && ./main
10
0
$ clang main.c -o main && ./main
257812584
0
$ gcc -O0 main.c -o main && ./main
10
32615
$ gcc main.c -o main && ./main
0
0
$ ./main
1009871352
0
$ ./main
1940232856
0
$ ./main
-628805544
0
$ ./main
-1315733560
0
$ ./main
-998120824
0